2023-10-13 09:51:56 +00:00
|
|
|
package logger
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2023-12-02 15:27:24 +00:00
|
|
|
"fmt"
|
2023-10-13 09:51:56 +00:00
|
|
|
"github.com/sirupsen/logrus"
|
2023-12-02 15:27:24 +00:00
|
|
|
"go-admin/tools/config"
|
|
|
|
"gopkg.in/natefinch/lumberjack.v2"
|
|
|
|
"path/filepath"
|
|
|
|
"time"
|
2023-10-13 09:51:56 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var l *Logx
|
|
|
|
|
|
|
|
var TraceIdKey = "trace_id"
|
|
|
|
|
|
|
|
type Logx struct {
|
|
|
|
*logrus.Logger
|
|
|
|
ctx *context.Context
|
|
|
|
}
|
|
|
|
|
|
|
|
type LogField struct {
|
|
|
|
Key string
|
|
|
|
Value interface{}
|
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
2023-12-21 09:36:13 +00:00
|
|
|
Setup()
|
2023-12-19 10:21:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func Setup() {
|
2023-10-13 09:51:56 +00:00
|
|
|
ctx := context.Background()
|
|
|
|
l = &Logx{
|
|
|
|
Logger: logrus.New(),
|
|
|
|
ctx: &ctx,
|
|
|
|
}
|
|
|
|
|
2023-12-02 15:27:24 +00:00
|
|
|
// 设置json格式
|
2023-10-13 09:51:56 +00:00
|
|
|
l.SetFormatter(&logrus.JSONFormatter{TimestampFormat: "2006-01-02 15:04:05"})
|
|
|
|
|
|
|
|
// 设置最低loglevel
|
2023-12-02 15:27:24 +00:00
|
|
|
l.SetLevel(logrus.InfoLevel)
|
|
|
|
|
|
|
|
// 设置输出到文件
|
|
|
|
logFileName := getLogFileName()
|
|
|
|
fileLogger := &lumberjack.Logger{
|
|
|
|
Filename: logFileName,
|
|
|
|
MaxSize: 100, // 每个日志文件的最大尺寸,单位为 MB
|
|
|
|
MaxBackups: 5, // 保留旧日志文件的最大个数
|
|
|
|
MaxAge: 60, // 保留旧日志文件的最大天数
|
|
|
|
Compress: true, // 是否压缩旧日志文件
|
|
|
|
}
|
|
|
|
defer fileLogger.Close()
|
|
|
|
|
|
|
|
// 将日志同时输出到文件和控制台
|
2023-12-11 08:21:21 +00:00
|
|
|
//l.SetOutput(io.MultiWriter(os.Stdout, fileLogger))
|
|
|
|
l.SetOutput(fileLogger)
|
2023-12-02 15:27:24 +00:00
|
|
|
}
|
2023-11-15 10:17:35 +00:00
|
|
|
|
2023-12-02 15:27:24 +00:00
|
|
|
// 获取日志文件名,按照 server-2023-12-01.log 的格式
|
|
|
|
func getLogFileName() string {
|
|
|
|
currentTime := time.Now().Format("2006-01-02")
|
|
|
|
logFileName := fmt.Sprintf("server-%s.log", currentTime)
|
|
|
|
// 可以指定日志文件存储的路径
|
|
|
|
logFilePath := config.LoggerConfig.Path
|
|
|
|
return filepath.Join(logFilePath, logFileName)
|
2023-10-13 09:51:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func WithContext(ctx context.Context) {
|
|
|
|
l.ctx = &ctx
|
|
|
|
}
|
|
|
|
|
|
|
|
func Field(key string, value interface{}) *LogField {
|
|
|
|
return &LogField{Key: key, Value: value}
|
|
|
|
}
|
|
|
|
|
|
|
|
func Info(msg string, fields ...*LogField) {
|
|
|
|
e := newEntry(fields...)
|
|
|
|
e.Info(msg)
|
|
|
|
}
|
|
|
|
|
|
|
|
func Error(msg string, fields ...*LogField) {
|
|
|
|
e := newEntry(fields...)
|
|
|
|
e.Error(msg)
|
|
|
|
}
|
|
|
|
|
|
|
|
func Debug(msg string, fields ...*LogField) {
|
|
|
|
e := newEntry(fields...)
|
|
|
|
e.Debug(msg)
|
|
|
|
}
|
|
|
|
|
|
|
|
func Warning(msg string, fields ...*LogField) {
|
|
|
|
e := newEntry(fields...)
|
|
|
|
e.Warning(msg)
|
|
|
|
}
|
|
|
|
|
|
|
|
func newEntry(fields ...*LogField) *logrus.Entry {
|
|
|
|
e := logrus.NewEntry(l.Logger)
|
|
|
|
traceId, ok := (*l.ctx).Value(TraceIdKey).(string)
|
|
|
|
if ok {
|
|
|
|
e = e.WithField("trace_id", traceId)
|
|
|
|
}
|
|
|
|
for _, field := range fields {
|
|
|
|
e = e.WithField(field.Key, field.Value)
|
|
|
|
}
|
|
|
|
return e
|
|
|
|
}
|
|
|
|
|
|
|
|
func Errorf(format string, args ...interface{}) {
|
|
|
|
l.Errorf(format, args)
|
|
|
|
}
|
|
|
|
|
2023-10-14 08:19:04 +00:00
|
|
|
func Fatal(args ...interface{}) {
|
2023-10-13 09:51:56 +00:00
|
|
|
l.Fatal(args)
|
|
|
|
}
|
2023-10-14 08:19:04 +00:00
|
|
|
|
|
|
|
func Println(args ...interface{}) {
|
|
|
|
l.Println(args)
|
|
|
|
}
|