centos

如何利用centos优化golang日志性能

小樊
45
2025-12-09 17:35:34
栏目: 编程语言

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
}

五 监控与压测建议

0
看了该问题的人还看了