在查询许多资料后,整理了以下代码:
package config
import (
"fmt"
nested "github.com/antonfisher/nested-logrus-formatter"
"github.com/lestrrat-go/file-rotatelogs"
"github.com/rifflock/lfshook"
"github.com/sirupsen/logrus"
"path/filepath"
"runtime"
"time"
)
var (
Log *logrus.Logger
)
func InitLogger() {
Log = logrus.New()
hook := NewLfsHook(filepath.Join(Cf.Logger.Path, "pack"), 0, 5)
Log.AddHook(hook)
Log.SetFormatter(formatter(true))
Log.SetReportCaller(true)
}
func formatter(isConsole bool) *nested.Formatter {
fmtter := &nested.Formatter{
HideKeys: true,
TimestampFormat: "2006-01-02 15:04:05",
CallerFirst: true,
CustomCallerFormatter: func(frame *runtime.Frame) string {
funcInfo := runtime.FuncForPC(frame.PC)
if funcInfo == nil {
return "error during runtime.FuncForPC"
}
fullPath, line := funcInfo.FileLine(frame.PC)
return fmt.Sprintf(" [%v:%v]", filepath.Base(fullPath), line)
},
}
if isConsole {
fmtter.NoColors = false
} else {
fmtter.NoColors = true
}
return fmtter
}
func NewLfsHook(logName string, rotationTime time.Duration, leastDay uint) logrus.Hook {
writer, err := rotatelogs.New(
// 日志文件
logName+".%Y%m%d%H%M%S",
// 日志周期(默认每86400秒/一天旋转一次)
//rotatelogs.WithRotationTime(rotationTime),
// 清除历史 (WithMaxAge和WithRotationCount只能选其一)
//rotatelogs.WithMaxAge(time.Hour*24*7), //默认每7天清除下日志文件
rotatelogs.WithRotationCount(leastDay), //只保留最近的N个日志文件
)
if err != nil {
panic(err)
}
// 可设置按不同level创建不同的文件名
lfsHook := lfshook.NewHook(lfshook.WriterMap{
logrus.DebugLevel: writer,
logrus.InfoLevel: writer,
logrus.WarnLevel: writer,
logrus.ErrorLevel: writer,
logrus.FatalLevel: writer,
logrus.PanicLevel: writer,
//}, &logrus.JSONFormatter{TimestampFormat: "2006-01-02 15:04:05"})
}, formatter(false))
return lfsHook
}
终端输出样式:
日志文件输出样式: