- 首页 >
- 问答 >
-
云计算 >
- Go语言在Linux服务器上的日志处理
Go语言在Linux服务器上的日志处理
小樊
41
2025-11-28 15:24:37
整体架构与选型
- 日志库选择
- 标准库 log:适合简单场景,配合 log.SetOutput / log.SetFlags 自定义输出与格式。
- 结构化与高性能:logrus(生态丰富)、zap(Uber 高性能)、zerolog(零分配)、slog(Go 1.21+ 官方结构化日志)。
- 输出与格式
- 统一字段:建议包含 时间戳、日志级别、调用位置(文件:行号)、请求ID/追踪ID、服务名/实例。
- 格式选择:人读优先用文本,机器分析优先 JSON;在 systemd 环境可输出到 stdout/stderr 由 journald 统一采集。
- 轮转与归档
- 应用内轮转:如 lumberjack,按文件大小/时间切分,便于容器与简单部署。
- 系统级轮转:使用 logrotate 做按日/大小切分、压缩与保留策略,适合物理机/虚拟机长期运行。
- 采集与分析
- 集中式:小规模可用 rsyslog/syslog-ng 转发;中大规模用 ELK(Elasticsearch/Logstash/Kibana)、Graylog、Splunk、Grafana Loki 等。
- 本地检索:journalctl -u 服务名 -f -p err 快速定位服务错误;命令行工具 grep/awk/sed/lnav 辅助分析。
快速上手示例
- 使用 zap + lumberjack(应用内轮转,适合容器/单实例)
- 要点:JSON 编码、设置日志级别、使用 lumberjack.Logger 控制单文件大小、备份数、保留天数与压缩;生产环境建议 defer logger.Sync() 刷盘。
- 示例:
- go.mod
- module demo
- go 1.21
- require go.uber.org/zap v1.27.0
- main.go
- package main
- import (
“go.uber.org/zap”
“go.uber.org/zap/zapcore”
“gopkg.in/natefinch/lumberjack.v2”
)
- func main() {
w := zapcore.AddSync(&lumberjack.Logger{
Filename: “./logs/app.log”,
MaxSize: 10, // MB
MaxBackups: 7,
MaxAge: 28, // days
Compress: true,
})
cfg := zap.NewProductionEncoderConfig()
cfg.TimeKey = “ts”
cfg.EncodeTime = zapcore.ISO8601TimeEncoder
core := zapcore.NewCore(
zapcore.NewJSONEncoder(cfg),
w,
zap.InfoLevel,
)
logger := zap.New(core, zap.AddCaller())
defer logger.Sync()
logger.Info(“started”, zap.String(“svc”, “demo”))
}
- 使用 logrus + logrotate(系统级轮转,适合 systemd 服务)
- 要点:JSON 格式、按级别输出;由 systemd 将 stdout/stderr 写入 journal;logrotate 负责文件切分与压缩。
- 示例:
- go.mod
- module demo
- go 1.21
- require github.com/sirupsen/logrus v1.9.3
- main.go
- package main
- import (
“github.com/sirupsen/logrus”
“os”
)
- func main() {
log := logrus.New()
log.SetFormatter(&logrus.JSONFormatter{
TimestampFormat: “2006-01-02 15:04:05”,
})
log.SetLevel(logrus.InfoLevel)
log.SetOutput(os.Stdout)
log.WithFields(logrus.Fields{
“svc”: “demo”,
}).Info(“started”)
}
- 服务文件 /etc/systemd/system/demo.service
- [Unit]
- Description=Demo Go App
- After=network.target
- [Service]
- ExecStart=/usr/local/bin/demo
- StandardOutput=journal
- StandardError=journal
- Restart=always
- [Install]
- WantedBy=multi-user.target
- 轮转配置 /etc/logrotate.d/demo
- /var/log/demo/*.log {
daily
missingok
rotate 7
compress
notifempty
create 640 root adm
sharedscripts
postrotate
systemctl reload demo.service >/dev/null 2>&1 || true
endscript
}
运行与运维实践
- 部署与采集
- 容器化:优先输出到 stdout/stderr,由容器运行时/编排平台收集并送往集中式系统;如需落盘,结合 emptyDir + sidecar 或 lumberjack。
- systemd 服务:使用 StandardOutput=journal,通过 journalctl -u demo -f 实时查看;必要时配合 rsyslog 转发到文件或远程。
- 检索与分析
- 本地快速定位:journalctl 过滤级别与单位;命令行组合 grep/awk/sed/lnav 做字段提取与统计。
- 集中式平台:ELK/Graylog/Loki 负责索引、查询、可视化与告警,便于跨实例与跨环境追踪。
性能与安全建议
- 性能优化
- 合理设置日志级别(生产常用 Info/Warn),避免过量 Debug。
- 采用 异步写入/批量写入 与合适缓冲,降低 I/O 阻塞;热点路径减少字符串拼接与反射。
- 选择高性能库(如 zap/zerolog),必要时开启 Sync 保障关键日志落盘。
- 稳定性与治理
- 统一字段与结构化输出,便于聚合与检索;为请求生成并透传 RequestID/TraceID,串联调用链日志。
- 异常与 panic 要记录堆栈与上下文,使用 recover 捕获并上报,避免静默崩溃。
- 安全合规
- 日志脱敏:对 密码、密钥、令牌、身份证号 等敏感信息进行掩码或哈希。
- 权限最小化:日志文件与目录权限设置为仅授权用户可读(如 640 root adm);集中式系统启用鉴权与审计。