你可以通过更改编码器来选择更适合阅读的格式。在 zap
中,最常见的是 zapcore.NewConsoleEncoder
,它将日志输出为易读的文本格式,而不是 JSON 格式。
修改后的代码(使用 Console Encoder):
package main
import (
"os"
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
var logger *zap.Logger
func Init() {
// 创建一个 Console 编码器,输出更易读的文本格式
encoderConfig := zap.NewDevelopmentEncoderConfig()
encoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder // 为了显示彩色日志
encoder := zapcore.NewConsoleEncoder(encoderConfig)
// 创建一个日志核心,输出到文件
fileCore := zapcore.NewCore(
encoder,
zapcore.AddSync(&lumberjack.Logger{
Filename: "logs/myapp.log",
MaxSize: 100, // MB
MaxBackups: 3,
MaxAge: 30, // days
}),
zap.InfoLevel,
)
// 创建另一个日志核心,输出到标准输出
consoleCore := zapcore.NewCore(
encoder,
zapcore.AddSync(os.Stdout),
zap.InfoLevel,
)
// 使用 zapcore.NewTee 将两个核心组合起来
log_zap := zap.New(zapcore.NewTee(fileCore, consoleCore))
// 将 logger 设置为全局变量
logger = log_zap
// 确保 logger 在退出时进行同步
defer logger.Sync()
}
func main() {
Init()
// 记录一条简单的日志
logger.Info("This is an info log")
// 记录一条带有字段的日志
logger.Info("This is an info log with fields",
zap.String("user", "john"),
zap.Int("age", 30),
)
}
关键变化:
- 使用
zapcore.NewConsoleEncoder
替代zapcore.NewJSONEncoder
,使得日志输出为更适合人类阅读的格式。 zap.NewDevelopmentEncoderConfig()
是一个用于开发环境的配置,它提供了更加友好的日志格式。EncodeLevel = zapcore.CapitalColorLevelEncoder
使日志级别使用彩色显示,这样在终端中可以更加清晰地区分不同级别的日志。
结果:
运行该代码后,日志输出将会是易于阅读的文本格式,例如:
2023-10-24T17:14:20.748+0800 INFO This is an info log
2023-10-24T17:14:20.748+0800 INFO This is an info log with fields user=“john” age=30
说明:
- 控制台输出:每条日志都以简洁的格式打印在控制台,便于开发者快速查看。
- 文件输出:日志将依然写入文件
logs/myapp.log
,但是也会以易读的文本格式输出。
如果你更喜欢不同的格式或者需要添加其他选项,可以根据具体需要调整 zap
配置。