Golang日志在 CentOS 的性能调优指南
一 库与级别选型
二 减少阻塞与 I/O 开销
三 系统层面的优化
四 可落地配置示例
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
"os"
)
func newZapLogger() *zap.Logger {
encCfg := zapcore.EncoderConfig{
TimeKey: "ts",
LevelKey: "level",
CallerKey: "caller",
MessageKey: "msg",
EncodeLevel: zapcore.CapitalLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
}
level := zap.NewAtomicLevelAt(zap.InfoLevel)
// 文件轮转:按大小切割、保留、压缩
writeSyncer := zapcore.AddSync(&lumberjack.Logger{
Filename: "/var/log/myapp.log",
MaxSize: 100, // MB
MaxBackups: 7,
MaxAge: 28, // 天
Compress: true,
})
// 可选:进一步缓冲,减少系统调用(按时间/大小刷新)
buffered := zapcore.AddSync(zapcore.BufferedWriteSyncer(writeSyncer, 256<<10, 1*time.Second))
core := zapcore.NewCore(
zapcore.NewJSONEncoder(encCfg),
buffered,
level,
)
return zap.New(core, zap.AddCaller(), zap.AddStacktrace(zap.ErrorLevel))
}
func main() {
logger := newZapLogger()
defer logger.Sync()
logger.Info("started", zap.String("svc", "order"))
}
// main.go
package main
import (
"log/slog"
"os"
)
func main() {
// JSON 输出便于检索;生产环境避免使用 TextHandler
logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelInfo,
}))
slog.SetDefault(logger)
slog.Info("started", "svc", "payment", "pid", os.Getpid())
}
/var/log/myapp.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
dateext
}
提示:copytruncate 更兼容正在写入的文件句柄;若应用支持重新打开日志文件(信号或重新配置),也可用 create/ postrotate 触发 reopen。
五 观测与持续优化