func setupLogger() error {
fileName := setting.LoggerSetting.LogSavePath + "/" +
setting.LoggerSetting.LogFileName + "_" + time.Now().Format("20060102150405") + setting.LoggerSetting.LogFileExt
setting.Logger = logger.NewLogger(&lumberjack.Logger{
Filename: fileName,
MaxSize: setting.LoggerSetting.MaxSize,
MaxAge: setting.LoggerSetting.MaxAge,
MaxBackups: setting.LoggerSetting.MaxBackups,
Compress: setting.LoggerSetting.Compress,
}, "")
return nil
}
package logger
import (
"fmt"
"io"
"runtime"
"time"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
type Fields map[string]interface{}
type Logger struct {
newLogger *zap.Logger
fields Fields
callers []string
}
func NewLogger(hook io.Writer, mode string) *Logger {
encoderConfig := zapcore.EncoderConfig{
TimeKey: "time",
LevelKey: "level",
NameKey: "logger",
CallerKey: "tag",
MessageKey: "msg",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder, // 小写编码器
EncodeTime: func(time time.Time, encoder zapcore.PrimitiveArrayEncoder) {
encoder.AppendString(time.Format("2006-01-02 15:04:05"))
}, // ISO8601 UTC 时间格式
EncodeDuration: zapcore.SecondsDurationEncoder,
EncodeCaller: zapcore.FullCallerEncoder, // 全路径编码器
EncodeName: zapcore.FullNameEncoder,
}
// 设置日志级别
atomicLevel := zap.NewAtomicLevel()
atomicLevel.SetLevel(zap.InfoLevel)
core := zapcore.NewCore(
zapcore.NewJSONEncoder(encoderConfig), // 编码器配置
zapcore.NewMultiWriteSyncer(zapcore.AddSync(hook)), //打印到文件 --打印到控制台:zapcore.AddSync(os.Stdout)
atomicLevel, // 日志级别
)
//输出文件和行号,前提是配置对象encoderConfig中必须设有CallerKey字段
caller := zap.AddCaller()
//由于再次封装日志,因此需要打印上一级的调用,1表示向上跳一级
callerSkip := zap.AddCallerSkip(1)
if mode == "debug" {
//开启开发模式
return &Logger{
newLogger: zap.New(core, caller, callerSkip, zap.Development()),
}
}
return &Logger{
newLogger: zap.New(core, caller, callerSkip),
}
}
func (l *Logger) clone() *Logger { //防止并发时的数据脏乱
nl := *l
return &nl
}
func (l *Logger) WithFields(f Fields) *Logger {
ll := l.clone()
if ll.fields == nil {
ll.fields = make(Fields)
}
for k, v := range f {
ll.fields[k] = v
}
return ll
}
func (l *Logger) WithCallersFrames() *Logger {
maxCallerDepth := 25
minCallerDepth := 1
callers := []string{}
pcs := make([]uintptr, maxCallerDepth)
depth := runtime.Callers(minCallerDepth, pcs)
frames := runtime.CallersFrames(pcs[:depth])
for frame, more := frames.Next(); more; frame, more = frames.Next() {
callers = append(callers, fmt.Sprintf("%s: %d %s", frame.File, frame.Line, frame.Function))
if !more {
break
}
}
ll := l.clone()
ll.callers = callers
return ll
}
func (l *Logger) Debug(msg string) {
if l.fields != nil {
l.newLogger.Debug(msg, zap.Any("field", l.fields))
return
}
ll := l.clone()
ll.newLogger.Debug(msg)
}
func (l *Logger) Debugf(format string, v ...interface{}) {
msg := fmt.Sprintf(format, v...)
if l.fields != nil {
l.newLogger.Debug(msg, zap.Any("field", l.fields))
return
}
ll := l.clone()
ll.newLogger.Debug(msg)
}
func (l *Logger) Info(msg string) {
if l.fields != nil {
l.newLogger.Info(msg, zap.Any("field", l.fields))
return
}
ll := l.clone()
ll.newLogger.Info(msg)
}
func (l *Logger) Infof(format string, v ...interface{}) {
msg := fmt.Sprintf(format, v...)
if l.fields != nil {
l.newLogger.Info(msg, zap.Any("field", l.fields))
return
}
ll := l.clone()
ll.newLogger.Info(msg)
}
func (l *Logger) Warn(msg string) {
if l.fields != nil {
l.newLogger.Warn(msg, zap.Any("field", l.fields))
return
}
ll := l.clone()
ll.newLogger.Warn(msg)
}
func (l *Logger) Warnf(format string, v ...interface{}) {
msg := fmt.Sprintf(format, v...)
if l.fields != nil {
l.newLogger.Warn(msg, zap.Any("field", l.fields))
return
}
ll := l.clone()
ll.newLogger.Warn(msg)
}
func (l *Logger) Error(msg string) {
if l.fields != nil {
l.newLogger.Error(msg, zap.Any("field", l.fields))
return
}
ll := l.clone()
ll.newLogger.Error(msg)
}
func (l *Logger) Errorf(format string, v ...interface{}) {
msg := fmt.Sprintf(format, v...)
if l.fields != nil {
l.newLogger.Error(msg, zap.Any("field", l.fields))
return
}
ll := l.clone()
ll.newLogger.Error(msg)
}
func (l *Logger) Fatal(msg string) {
if l.fields != nil {
l.newLogger.Fatal(msg, zap.Any("field", l.fields))
return
}
ll := l.clone()
ll.newLogger.Fatal(msg)
}
func (l *Logger) Fatalf(format string, v ...interface{}) {
msg := fmt.Sprintf(format, v...)
if l.fields != nil {
l.newLogger.Fatal(msg, zap.Any("field", l.fields))
return
}
ll := l.clone()
ll.newLogger.Fatal(msg)
}
func (l *Logger) Panic(msg string) {
if l.fields != nil {
l.newLogger.Panic(msg, zap.Any("field", l.fields))
return
}
ll := l.clone()
ll.newLogger.Panic(msg)
}
func (l *Logger) Panicf(format string, v ...interface{}) {
msg := fmt.Sprintf(format, v...)
if l.fields != nil {
l.newLogger.Panic(msg, zap.Any("field", l.fields))
return
}
ll := l.clone()
ll.newLogger.Panic(msg)
}