通过调用zap.NewProduction()/zap.NewDevelopment()或者zap.NewExample()创建一个 Logger 。上面的每一个函数都将创建一个 logger 。唯一的区别在于它将记录的信息不同。例如 production logger 默认记录调用函数信息、日期和时间等。通过 Logger 调用 INFO 、 ERROR 等。默认情况下日志都会打印到应用程序的 console 界面。
Example和Production使用的是 json 格式输出,Development 使用行的形式输出
Development
从警告级别向上打印到堆栈中来跟踪
始终打印包/文件/行(方法)
在行尾添加任何额外字段作为 json 字符串
以大写形式打印级别名称
以毫秒为单位打印 ISO8601 格式的时间戳
Production
调试级别消息不记录
Error , Dpanic 级别的记录,会在堆栈中跟踪文件, Warn 不会
始终将调用者添加到文件中
以时间戳格式打印日期
以小写形式打印级别名称
示例
package main
import (
"time"
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
var logger *zap.Logger
func InitLogger(logpath string, loglevel string) {
hook := lumberjack.Logger{
Filename: logpath,
MaxSize: 10,
MaxBackups: 30,
MaxAge: 7,
Compress: true,
}
write := zapcore.AddSync(&hook)
var level zapcore.Level
switch loglevel {
case "debug":
level = zap.DebugLevel
case "info":
level = zap.InfoLevel
case "error":
level = zap.ErrorLevel
default:
level = zap.InfoLevel
}
encoderConfig := zapcore.EncoderConfig{
TimeKey: "time",
LevelKey: "level",
NameKey: "logger",
CallerKey: "linenum",
MessageKey: "msg",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
EncodeDuration: zapcore.SecondsDurationEncoder,
EncodeCaller: zapcore.FullCallerEncoder,
EncodeName: zapcore.FullNameEncoder,
}
atomicLevel := zap.NewAtomicLevel()
atomicLevel.SetLevel(level)
core := zapcore.NewCore(
zapcore.NewJSONEncoder(encoderConfig),
write,
level,
)
caller := zap.AddCaller()
development := zap.Development()
filed := zap.Fields(zap.String("serviceName", "serviceName"))
logger = zap.New(core, caller, development, filed)
logger.Info("DefaultLogger init success")
}
func main() {
InitLogger("./all.log", "debug")
logger.Info("test",
zap.String("string", "string"),
zap.Int("int", 3),
zap.Duration("time", time.Second),
)
logger.Sugar().Infow("test-",
"string", "string",
"int", 1,
"time", time.Second,
)
}