log
日志常用示例
package main
import (
"fmt"
"io"
"io/ioutil"
"runtime"
"strings"
"time"
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
"github.com/rifflock/lfshook"
"github.com/sirupsen/logrus"
)
func NewWriter(perfix string) io.Writer {
w, err := rotatelogs.New(
perfix+".%Y%m%d.json",
// 建立软接
rotatelogs.WithLinkName(perfix),
// 最多保存一星期
rotatelogs.WithMaxAge(7*24*time.Hour),
// 一天切割一次
rotatelogs.WithRotationTime(24*time.Hour),
)
if err != nil {
panic(err)
}
return w
}
func InitLog(perfix string) {
wm := lfshook.WriterMap{
logrus.DebugLevel: NewWriter(perfix + "_debug"),
logrus.InfoLevel: NewWriter(perfix + "_info"),
logrus.WarnLevel: NewWriter(perfix + "_warn"),
logrus.ErrorLevel: NewWriter(perfix + "_error"),
logrus.FatalLevel: NewWriter(perfix + "_fatal"),
}
logrus.AddHook(lfshook.NewHook(
wm,
&logrus.JSONFormatter{
CallerPrettyfier: func(f *runtime.Frame) (string, string) {
var callerName, fileName string
names := strings.SplitAfterN(f.File, perfix, 2)
if len(names) > 1 {
fileName = fmt.Sprintf("%v;%v", names[1], f.Line)
}
names = strings.SplitAfterN(f.Function, perfix, 2)
if len(names) > 1 {
callerName = names[1]
} else {
callerName = f.Function
}
return callerName, fileName
},
PrettyPrint: true,
},
))
logrus.SetOutput(ioutil.Discard)
logrus.SetReportCaller(true)
logrus.SetLevel(logrus.InfoLevel)
logrus.WithFields(logrus.Fields{
"perfix": perfix,
"level": logrus.GetLevel(),
}).Warn("日志初始化完成")
}