129 lines
2.9 KiB
Go
129 lines
2.9 KiB
Go
package logx
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"log/slog"
|
|
"os"
|
|
"path"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/zeromicro/go-zero/core/logx"
|
|
"gopkg.in/natefinch/lumberjack.v2"
|
|
)
|
|
|
|
var workdir, _ = filepath.Abs(filepath.Dir(os.Args[0]))
|
|
|
|
// Logger 包装 slog,并适配 go-zero 的 logx.Writer(按天日志)
|
|
type Logger struct {
|
|
*slog.Logger
|
|
}
|
|
|
|
func SetDefault(logger *Logger) {
|
|
slog.SetDefault(logger.Logger)
|
|
}
|
|
|
|
// NewLogger 按配置创建按天日志
|
|
func NewLogger(conf LogConf) *Logger {
|
|
logLevel := slog.LevelInfo
|
|
switch strings.ToLower(conf.Level) {
|
|
case "error":
|
|
logLevel = slog.LevelError
|
|
case "warn":
|
|
logLevel = slog.LevelWarn
|
|
case "debug":
|
|
logLevel = slog.LevelDebug
|
|
}
|
|
if !strings.Contains(conf.TimeFormat, "2006") {
|
|
conf.TimeFormat = "2006-01-02 15:04:05"
|
|
}
|
|
|
|
if !path.IsAbs(conf.Filename) {
|
|
conf.Filename = filepath.Join(workdir, conf.Filename)
|
|
}
|
|
|
|
var fileWriter io.Writer
|
|
if conf.Daily {
|
|
fileWriter = newDailyWriter(conf)
|
|
} else {
|
|
fileWriter = &lumberjack.Logger{
|
|
Filename: conf.Filename,
|
|
MaxSize: conf.MaxSize,
|
|
MaxBackups: conf.MaxBackups,
|
|
MaxAge: conf.MaxAge,
|
|
Compress: conf.Compress,
|
|
}
|
|
}
|
|
|
|
var writer io.Writer = fileWriter
|
|
if conf.Console {
|
|
writer = io.MultiWriter(writer, os.Stdout)
|
|
}
|
|
|
|
opts := &slog.HandlerOptions{Level: logLevel, AddSource: conf.AddSource}
|
|
var h slog.Handler
|
|
if strings.EqualFold(conf.Format, "json") {
|
|
h = slog.NewJSONHandler(writer, opts)
|
|
} else {
|
|
h = slog.NewTextHandler(writer, opts)
|
|
}
|
|
|
|
return &Logger{Logger: slog.New(h)}
|
|
}
|
|
|
|
func (l *Logger) Close() error {
|
|
return nil
|
|
}
|
|
|
|
func (l *Logger) buildAttrs(fields []logx.LogField) []slog.Attr {
|
|
attrs := make([]slog.Attr, 0, len(fields))
|
|
for _, f := range fields {
|
|
attrs = append(attrs, slog.Any(f.Key, f.Value))
|
|
}
|
|
return attrs
|
|
}
|
|
|
|
func (l *Logger) logAttrs(level slog.Level, msg string, attrs ...slog.Attr) {
|
|
l.Logger.LogAttrs(context.Background(), level, msg, attrs...)
|
|
}
|
|
|
|
// --- 实现 logx.Writer 接口 ---
|
|
func (l *Logger) Write(p []byte) (int, error) {
|
|
l.logAttrs(slog.LevelInfo, strings.TrimSpace(string(p)))
|
|
return len(p), nil
|
|
}
|
|
|
|
func (l *Logger) Alert(v any) {
|
|
l.logAttrs(slog.LevelError, fmt.Sprint(v))
|
|
}
|
|
|
|
func (l *Logger) Debug(v any, fields ...logx.LogField) {
|
|
l.logAttrs(slog.LevelDebug, fmt.Sprint(v), l.buildAttrs(fields)...)
|
|
}
|
|
|
|
func (l *Logger) Error(v any, fields ...logx.LogField) {
|
|
l.logAttrs(slog.LevelError, fmt.Sprint(v), l.buildAttrs(fields)...)
|
|
}
|
|
|
|
func (l *Logger) Info(v any, fields ...logx.LogField) {
|
|
l.logAttrs(slog.LevelInfo, fmt.Sprint(v), l.buildAttrs(fields)...)
|
|
}
|
|
|
|
func (l *Logger) Severe(v any) {
|
|
l.logAttrs(slog.LevelError, fmt.Sprint(v))
|
|
}
|
|
|
|
func (l *Logger) Slow(v any, fields ...logx.LogField) {
|
|
l.logAttrs(slog.LevelWarn, fmt.Sprint(v), l.buildAttrs(fields)...)
|
|
}
|
|
|
|
func (l *Logger) Stack(v any) {
|
|
l.logAttrs(slog.LevelError, fmt.Sprintf("%+v", v))
|
|
}
|
|
|
|
func (l *Logger) Stat(v any, fields ...logx.LogField) {
|
|
l.logAttrs(slog.LevelInfo, fmt.Sprint(v), l.buildAttrs(fields)...)
|
|
}
|