CentOS环境下提升Golang日志性能的可落地方案
一 关键优化方向与取舍
二 应用侧配置示例
package main
import (
"fmt"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
"os"
)
func newZapLogger() *zap.Logger {
atomicLevel := zap.NewAtomicLevelAt(zap.InfoLevel)
encCfg := zapcore.EncoderConfig{
TimeKey: "ts",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
MessageKey: "msg",
StacktraceKey:"stacktrace",
EncodeLevel: zapcore.CapitalLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
EncodeDuration: zapcore.MillisDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
}
core := zapcore.NewCore(
zapcore.NewJSONEncoder(encCfg),
zapcore.AddSync(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100, // MB
MaxBackups: 7,
MaxAge: 28, // 天
Compress: true,
}),
atomicLevel,
)
return zap.New(core, zap.AddCaller(), zap.AddStacktrace(zap.ErrorLevel))
}
func main() {
logger := newZapLogger()
defer logger.Sync()
logger.Info("service started", zap.String("version", "1.2.3"))
logger.Warn("disk usage high", zap.Float64("usage", 92.5))
logger.Error("db query failed", zap.Error(fmt.Errorf("timeout")))
}
package main
import (
"log"
"os"
)
func main() {
f, err := os.OpenFile("/var/log/myapp/std.log",
os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil { panic(err) }
defer f.Close()
log.SetOutput(f)
log.SetFlags(log.LstdFlags | log.Lshortfile | log.LUTC)
log.Println("hello, standard logger")
}
import "go.uber.org/zap/zapcore"
var atomicLevel zap.AtomicLevel
atomicLevel.SetLevel(zap.InfoLevel) // 运行时可改为 DebugLevel
core := zapcore.NewCore(encoder, writer, &atomicLevel)
三 系统与运维侧优化
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0644 myapp myapp
sharedscripts
postrotate
/usr/bin/systemctl kill -s HUP myapp.service >/dev/null 2>&1 || true
endscript
}
四 验证与监控
五 常见陷阱与规避