发布于2026-07-03 阅读(0)
扫一扫,手机访问
有朋友问过:Debian上跑Go服务,日志到底怎么配才靠谱?其实这事儿说简单也简单,但要是没用过,上手总会碰到几个小坑。今天就把从选库到落盘的全过程捋一遍,省得你再走弯路。

Go标准库自带的log包肯定能用,但说实话,真要上了生产环境,功能确实有点单薄。常见的第三方库有这么几个:logrus、zap、zerolog,各自侧重不同,比如logrus胜在API友好,zap追求极致性能。选哪个取决于你的场景,一般团队里用logrus会顺手些。
如果决定用logrus,一行命令就能搞定:
go get github.com/sirupsen/logrus其他库的安装套路都一样,把包名换成你选的就行。
用标准库的话,示例非常简洁:
package mainimport ( "log" "os")func main() { log.SetOutput(os.Stdout) log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) log.Println("这是一条日志信息")}这里的关键是SetFlags——Ldate、Ltime、Lshortfile能带上时间和代码位置,排查问题的时候救场利器。
换成logrus,配置起来更灵活。比如想要JSON格式的日志,方便Logstash这类工具解析:
package mainimport ( "github.com/sirupsen/logrus")func main() { log := logrus.New() log.SetLevel(logrus.DebugLevel) log.SetFormatter(&logrus.JSONFormatter{}) log.Info("这是一条日志信息")}设置日志级别也很直观,DebugLevel意味着所有级别的日志都会输出,你可以根据环境灵活调整。
代码写好之后,go build 编译,直接运行程序,日志会按照你配置的方式输出到终端。如果配置了JSON格式,出来的就是一串干净的结构化数据,方便后续处理。
开发环境随便写没事,生产环境要是日志无限增长,早晚出问题——消息队列泄漏、磁盘写满,哪个都够受的。日志轮转就是干这个的。
有两种主流方式:一是用lumberjack在程序里直接控制,二是用系统级的logrotate。如果追求代码内闭环,lumberjack的配置示例:
import ( "gopkg.in/natefinch/lumberjack.v2" "log")func init() { log.SetOutput(&lumberjack.Logger{ Filename: "/var/log/myapp.log", MaxSize: 10, // 兆字节 MaxBackups: 3, MaxAge: 28, // 天 Compress: true, })}这样写下来,日志自动按10MB切割,保留最近3份,超过28天的自动清掉。那个Compress选true还会压缩旧日志,省磁盘空间。
开发环境你可能想看到Debug级别的信息,帮助调试;生产环境则只输出Info和Error级别就好,免得日志量太大。怎么实现?最简单的是读环境变量或配置文件。比如设一个LOG_LEVEL变量,程序启动时读取,动态设置日志级别。这样部署到不同环境只需要改环境变量,不用动代码。
整套配置下来,日志输出就能做到既稳定又灵活。不过也提醒一下:生产环境里日志的安全性和性能还是要慎重考虑——敏感信息别打到日志里,日志量过大也要预留I/O和磁盘空间。把握好这个度,日志才能真正成为你的好帮手。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8