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.
132 lines
3.3 KiB
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
|
|
}
|