CentOS上优化Golang日志性能的可落地方案
一 核心优化策略
二 系统层优化
三 代码级实践与示例
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
"os"
)
func newZapLogger() *zap.Logger {
// 级别:生产默认 INFO
level := zap.NewAtomicLevelAt(zap.InfoLevel)
// 编码器:生产用 JSON,时间 ISO8601
encCfg := zapcore.EncoderConfig{
TimeKey: "ts",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
MessageKey: "msg",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.CapitalLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
EncodeDuration: zapcore.MillisDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
}
// 轮转:按大小切分,保留 7 天,压缩归档
writeSyncer := zapcore.AddSync(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100, // MB
MaxBackups: 7,
MaxAge: 28, // 天
Compress: true,
})
// 可选:再包一层缓冲,进一步减少系统调用
buffered := zapcore.AddSync(&zapcore.BufferedWriteSyncer{
Writer: writeSyncer,
FlushInterval: 5 * 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("service started", zap.String("version", "v1.2.3"))
}
import "go.uber.org/zap/zapcore"
var atomicLevel zap.AtomicLevel
atomicLevel.SetLevel(zap.InfoLevel) // 默认 INFO
// 在 HTTP/信号处理器中动态调级
func setLogLevel(l zapcore.Level) { atomicLevel.SetLevel(l) }
四 推荐的 logrotate 配置
sudo yum install -y logrotate
sudo systemctl enable --now logrotate.timer # CentOS 7/8 常见做法
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
dateext
maxsize 100M
}
五 监控与压测建议