发布于2026-07-03 阅读(0)
扫一扫,手机访问
日志这事儿,看着简单,真要做好,其实挺讲究的。尤其是在 Debian 上用 Golang 写服务,日志怎么打、打到哪、怎么轮转、怎么和安全挂钩,每一步都可能影响线上问题的排查效率。或者说,决定日志系统好不好的,往往就是下面这几条基本原则。
先把几个核心判断摆出来:
聊到具体的日志库,Go 生态里目前比较主流的,大概有这么几个:
输出策略上,开发和调试阶段输出到控制台,方便实时查看;生产环境则建议输出到文件,便于持久化、归档和审计。格式方面,JSON 是首选,因为 ELK/EFK 这类系统解析起来最方便;如果实在需要可读性,也可以考虑文本格式。
性能方面,别忘了启用缓冲或异步写入。zap 的缓冲 Core、或者基于 channel 的异步适配,都能减少 I/O 阻塞对业务线程的影响。
文件轮转这事儿,很多人可能觉得找个工具切一下就行,但真要稳定跑起来,还是得把规则定好。
sudo apt-get install logrotate。配置示例 /etc/logrotate.d/myapp:/var/log/myapp.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 root adm
}
myapp.service 片段:[Unit]
Description=My Golang Application
After=network.target
[Service]
ExecStart=/usr/local/bin/myapp
Restart=always
User=myuser
Group=mygroup
Environment=GO_ENV=production
[Install]
WantedBy=multi-user.target
聊个更严肃的话题——安全。日志里藏了太多敏感信息,一旦泄露,后果很严重。所以:
日志写好了,只是第一步。更关键的是,怎么把这些日志用起来。
最后,直接上一段代码,看看怎么用 zap 输出到控制台,由 systemd 采集,并支持运行时调级和采样:
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"os"
)
func main() {
cfg := zap.Config{
Level: zap.NewAtomicLevelAt(zap.InfoLevel),
Encoding: "json",
EncoderConfig: zapcore.EncoderConfig{
TimeKey: "ts",
LevelKey: "level",
MessageKey: "msg",
StacktraceKey: "stacktrace",
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
},
OutputPaths: []string{"stdout"},
ErrorOutputPaths: []string{"stderr"},
Sampling: &zap.SamplingConfig{
Initial: 100,
Thereafter: 100,
},
}
logger, _ := cfg.Build()
defer logger.Sync()
logger.Info("service started", zap.String("version", "1.2.3"))
}
部署为 systemd 服务(参考上一节的示例),再通过 /etc/logrotate.d/myapp 配置轮转策略,一条完整的生产可用日志链路就齐了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8