You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
golog/slog.go

132 lines
3.3 KiB

package golog
import (
"context"
"github.com/natefinch/lumberjack"
"go.dtapp.net/gotime"
"go.dtapp.net/gotrace_id"
"log/slog"
"os"
)
type SLogFun func() *SLog
type sLogConfig struct {
logPath string // [File]日志文件路径
logName string // [File]日志文件名
maxSize int // [File]单位为MB,默认为512MB
maxBackups int // [File]保留旧文件的最大个数
maxAge int // [File]文件最多保存多少天 0=不删除
showLine bool // [File、Console]显示代码行
}
type SLog struct {
config *sLogConfig
jsonHandler *slog.JSONHandler
textHandler *slog.TextHandler
logger *slog.Logger
}
type SLogFileConfig struct {
LogPath string // 日志文件路径
LogName string // 日志文件名
MaxSize int // 单位为MB,默认为512MB
MaxBackups int // 保留旧文件的最大个数
MaxAge int // 文件最多保存多少天 0=不删除
ShowLine bool // 显示代码行
}
func NewSlogFile(ctx context.Context, config *SLogFileConfig) *SLog {
sl := &SLog{
config: &sLogConfig{
logPath: config.LogPath,
logName: config.LogName,
maxSize: config.MaxSize,
maxBackups: config.MaxBackups,
maxAge: config.MaxAge,
showLine: config.ShowLine,
},
}
opts := slog.HandlerOptions{
AddSource: sl.config.showLine,
Level: slog.LevelDebug,
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
if a.Key == slog.TimeKey {
a.Value = slog.StringValue(a.Value.Time().Format(gotime.DateTimeFormat))
//return slog.Attr{}
}
return a
},
}
lumberjackLogger := lumberjack.Logger{
Filename: sl.config.logPath + sl.config.logName, // ⽇志⽂件路径
MaxSize: sl.config.maxSize, // 单位为MB,默认为512MB
MaxAge: sl.config.maxAge, // 文件最多保存多少天
MaxBackups: sl.config.maxBackups, // 保留旧文件的最大个数
}
// json格式输出
sl.jsonHandler = slog.NewJSONHandler(&lumberjackLogger, &opts)
sl.logger = slog.New(sl.jsonHandler)
return sl
}
type SLogConsoleConfig struct {
ShowLine bool // 显示代码行
}
func NewSlogConsole(ctx context.Context, config *SLogConsoleConfig) *SLog {
sl := &SLog{
config: &sLogConfig{
showLine: config.ShowLine,
},
}
opts := slog.HandlerOptions{
AddSource: sl.config.showLine,
Level: slog.LevelDebug,
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
if a.Key == slog.TimeKey {
a.Value = slog.StringValue(a.Value.Time().Format(gotime.DateTimeFormat))
//return slog.Attr{}
}
return a
},
}
// json格式输出
sl.jsonHandler = slog.NewJSONHandler(os.Stdout, &opts)
sl.logger = slog.New(sl.jsonHandler)
return sl
}
// WithLogger 跟踪编号
func (sl *SLog) WithLogger() *slog.Logger {
logger := slog.New(sl.jsonHandler)
return logger
}
// WithTraceId 跟踪编号
func (sl *SLog) WithTraceId(ctx context.Context) *slog.Logger {
jsonHandler := sl.jsonHandler.WithAttrs([]slog.Attr{
slog.String("trace_id", gotrace_id.GetTraceIdContext(ctx)),
})
logger := slog.New(jsonHandler)
return logger
}
// WithTraceIdStr 跟踪编号
func (sl *SLog) WithTraceIdStr(traceId string) *slog.Logger {
jsonHandler := sl.jsonHandler.WithAttrs([]slog.Attr{
slog.String("trace_id", traceId),
})
logger := slog.New(jsonHandler)
return logger
}