linux

Golang在Linux环境下如何进行日志管理

小樊
42
2026-01-01 00:31:55
栏目: 编程语言

Linux 下 Golang 日志管理实践

一 核心要点

二 日志库选择与对比

特点 典型场景
log(标准库) 简单、零依赖 学习/小型工具
logrus 结构化、插件多、API 友好 业务服务快速落地
zap 高性能、结构化、可深度定制 高并发/生产核心服务
zerolog 零分配、极致性能 对延迟敏感的服务
slog(Go 1.21+) 官方结构化日志、统一接口 希望减少第三方依赖

说明:上述库均支持日志级别、格式化与输出目标配置;在需要高性能与可观测性时,优先 zap/zerolog/slog

三 快速上手示例

package main

import (
	"github.com/sirupsen/logrus"
	"gopkg.in/natefinch/lumberjack.v2"
)

func main() {
	logger := logrus.New()
	logger.SetFormatter(&logrus.JSONFormatter{
		TimestampFormat: "2006-01-02 15:04:05",
	})
	logger.SetLevel(logrus.InfoLevel)

	logger.SetOutput(&lumberjack.Logger{
		Filename:   "/var/log/myapp/app.log",
		MaxSize:    100,   // MB
		MaxBackups: 7,     // 保留旧文件个数
		MaxAge:     28,    // 天
		Compress:   true,  // 压缩
	})

	logger.WithFields(logrus.Fields{
		"service": "order",
		"trace_id": "abc-123",
	}).Info("order created")
}
package main

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

func main() {
	writeSyncer := zapcore.AddSync(&lumberjack.Logger{
		Filename:   "/var/log/myapp/app.log",
		MaxSize:    100,
		MaxBackups: 7,
		MaxAge:     28,
		Compress:   true,
	})
	encoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
	core := zapcore.NewCore(encoder, writeSyncer, zap.InfoLevel)
	logger := zap.New(core, zap.AddCaller())
	defer logger.Sync()

	logger.Info("user login",
		zap.String("user_id", "u1001"),
		zap.String("ip", "192.168.1.10"))
}

提示:生产环境建议开启 logger.Sync() 或使用 AddSynclumberjack 以确保关键日志落盘。

四 文件轮转与系统整合

五 性能与安全最佳实践

0
看了该问题的人还看了