golang 日志统一处理?

2021-11-13 23:06:13 +08:00
 seaguest

目前系统到处都打印日志,有各自模块的 logger ( gorm ,gin ,业务日志...),目前用的是 supervisor 管理,但是当系统并发数较高,日志打印过多,会导致 supervisor 的 cpu 飚升。

尽管各个日志都有 logger ,可以设置 SetOutput 直接写到文件,但是总有一些第三方库输出到 stdout ,所以没有办法实现统一定向到日志文件。目前找到的一个办法是:

file, err := os.OpenFile("log", os.O_APPEND|os.O_WRONLY|os.O_CREATE, os.ModePerm)
syscall.Dup2(int(file.Fd()), int(os.Stdout.Fd()))
syscall.Dup2(int(file.Fd()), int(os.Stderr.Fd()))

这样可以将 stdout 直接输出到日志,可以实现自己的需求,但是感觉不像是一个常规的方案,有没有比较好的日志方案,尽量简洁,能做到所有日志写入文件,最好能实现自动 rotate 。

1502 次点击
所在节点    问与答
6 条回复
adoal
2021-11-13 23:40:01 +08:00
换个思路,你是写业务系统的程序员,这些“运维”性质的功能不要在业务系统里自己写,要善用现有的基础设施。

如果只是在 Linux 用,不考虑兼容 Windows ,可以打到 syslog 去,然后由 logrotate 来卷。正常的 Linux 发行版,默认安装都带了 syslog 服务(多数是 rsyslogd )和 logrotate ,人家是专业干这个的,久经生产环境考验了。
masterclock
2021-11-14 00:14:02 +08:00
日志就输出到 stdout 或 stderr ,其他啥都不要考虑,这不是一个程序应该关心的事情。
vvhhaaattt
2021-11-14 08:39:55 +08:00
supervisor 在 std 输出过多时,性能确实不太好。
但你直接写到文件,轮转也需要注意。
systemd 是个好东西,不管是功能还是性能都很好,而且作为系统服务,能力范围也更大,但 supervisor 用惯了的也大有人在
seaguest
2021-11-14 10:24:51 +08:00
@adoal

谢谢你的建议,目前因为系统处于初级阶段,还是部署在云服务器上,但是后面稳定了会开始部署到 K8S 里。
syslog 的话会不会和系统其他应用所有的日志混合在一起了?假如机器上部署了 A ,B ,C 三个服务,他们的日志会混在一起么?
另外考虑到未来会部署在 Docker 里面,要么选择 loki 方案,或者 ELK ,但是这样也面临一个问题,第三方库打印的日志,就可能丢失。
seaguest
2021-11-14 10:37:47 +08:00
@vvhhaaattt

看了几个 golang log-rotate 的开源项目,其实也不复杂,用了几个试试,效果比 supervisor 那个好太多了。
systemd 单机还行,但是我们后面等系统成熟了会部署到 k8s ,就必须考虑 Docker 里面的方案,
目前的这种 log.SetOutput()方式,如果写入 ELK 也是比较方便配置的。
adoal
2021-11-14 13:28:42 +08:00
syslog 可以配置过滤,可以配置打到远程服务器。
对老派 Unix/Linux 用户(甚至只是用户,不是职业运维)来说这些都是挺基本的技能。
不过貌似云时代的 PPT 架构师们都不太把这些老派的玩意当回事😄

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/815206

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX