利用 Golang 日志提升 CentOS 应用性能
一 核心优化策略
二 系统层与运维配置
/var/log/myapp/*.log {
daily
rotate 7
missingok
compress
delaycompress
copytruncate
size 100M
postrotate
systemctl reload myapp >/dev/null 2>&1 || true
endscript
}
说明:使用 copytruncate 可减少应用重开文件描述符的风险;按业务调整 size/rotate。三 代码落地示例(zap + lumberjack + 异步批量)
package main
import (
"os"
"time"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
func newZapLogger() *zap.Logger {
// 1) 编码器:生产环境建议 JSON;仅在本地调试时启用颜色/开发友好格式
encCfg := zap.NewProductionEncoderConfig()
encCfg.EncodeTime = zapcore.ISO8601TimeEncoder
encoder := zapcore.NewJSONEncoder(encCfg)
// 2) 输出:lumberjack 负责轮转
writer := &lumberjack.Logger{
Filename: "/var/log/myapp/app.log", // 确保目录可写:chown/chmod
MaxSize: 100, // MB
MaxBackups: 7,
MaxAge: 28, // days
Compress: true,
}
// 3) 批处理:减少系统调用(可按需调大缓冲与刷新间隔)
syncer := zapcore.AddSync(&zapcore.BufferedWriteSyncer{
Writer: writer,
FlushInterval: 1 * time.Second,
BufferSize: 64 * 1024, // 64KB
})
core := zapcore.NewCore(encoder, syncer, zap.InfoLevel)
return zap.New(core, zap.AddCallerSkip(1))
}
func main() {
logger := newZapLogger()
defer logger.Sync() // 程序退出前尽量落盘
for i := 0; i < 1000; i++ {
logger.Info("processed request",
zap.Int("id", i),
zap.String("handler", "/api/v1/ping"),
zap.Duration("latency", time.Millisecond*time.Duration(i%50+10)),
)
}
}
提示:若需动态变更级别,可用 zap.AtomicLevel 配合 HTTP/信号热更新;远程集中式日志建议走异步批量通道,避免阻塞业务。四 性能验证与持续优化