设计一个 go 的日志库

2022-12-07 15:29:16 +08:00
 yuancoder

日志库是最基础和最重要的库,go 官方的日志库功能太简陋,项目中经常使用的功能:日志级别,json 格式,按日期旋转文件等都不支持。

而使用最多的 logrus 库也不支持按时间旋转文件,还要依赖另外三方包去实现。

所以我决定重新设计一个简单易用的日志库 ylog.

ylog 日志库特点:

项目: https://github.com/lyuangg/ylog

设计思想: http://yuancoder.com/ylog/

2035 次点击
所在节点    Go 编程语言
19 条回复
adoal
2022-12-07 15:45:46 +08:00
其实大多时候打到 syslog 去让 rsyslogd 和 logrotate 去处理日志运维的杂事(比如切分)就够用了。

哦,用 Windows 的请直接无视我。
adoal
2022-12-07 15:49:00 +08:00
另,以上不针对功能性的轮子。只针对日志切分、旋转这种运维性质的杂活。
0o0O0o0O0o
2022-12-07 15:52:35 +08:00
感觉维基百科译作日志轮替比日志旋转好理解很多
yuancoder
2022-12-07 15:53:20 +08:00
@adoal logrus 的作者也是这么想的,可现实不是这样的
janxin
2022-12-07 15:58:05 +08:00
额,标准库马上要加日志库了...
zhengjianyang
2022-12-07 16:01:07 +08:00
标准库不是要有了吗
adoal
2022-12-07 16:07:44 +08:00
@yuancoder 那有什么必须的理由把 rotation 做成 application 的一部分而不是外部功能呢?

作为一个运维人员,我想到用外部功能来做的主要理由是,logging 虽然不属于业务功能,但毕竟还是应用系统的一部分,属于业务发出的动作,而 rotation 则完全和业务无关,是“带外”操作,其逻辑本身就是外部化的。rotation 跟业务逻辑没有什么必然关系,生产环境所要维护的 rotation 操作,外部化之后,可以用专门做 rotation 的组件来配置足够复杂和灵活的处理规则,这些没必要让做开发的角色来操心。这种解耦有利于业务程序员和基建运维发挥各自的长处,各司其职,而不是业务程序员操心基建开发,在“进程内”造轮子,运维又要学习一堆繁杂但又不见得比现有成熟基建更强大的专用配置来吐槽。
paccco
2022-12-07 16:12:42 +08:00
@adoal #7 完全同意,这样增加了运维的复杂度
adoal
2022-12-07 16:13:51 +08:00
另外,不是说日志库完全不需要考虑 rotation 。只要留个操作,可以 reopen 当前的日志文件就行了。外部 rotation 工具在移动日志文件后往进程传一个 rotation 指示(比如 kill -HUP ),进程收到后 reopen 日志文件,就写到新的文件里去了。而不需要在日志库里对日志文件的更替做定时管理。日志库里要再加上这个功能,那又要牵扯到定时任务管理,更加复杂了。
qW7bo2FbzbC0
2022-12-07 16:19:59 +08:00
我觉得 logrus 适合用在脚本或者小工具上,大点的项目我用 zap 更多点
adoal
2022-12-07 16:29:09 +08:00
再比如,用 logrotate ,我可以配置 pre 和 post 脚本,在 rotate 动作的前后做一些处理。

而 rotate 功能做在 application 内部了,怎么办呢?让写 application 的业务开发团队加这个功能,然后业务开发再去推写 log 库的人加这个功能?就算实现了,谁能保证专注于写业务的开发团队顺手做的能比人家 logrotate 一心一意做了这么多年积累下来的经验更可靠?那我当然是希望业务开发团队不要操心这些事情。
polythene
2022-12-07 16:39:26 +08:00
下一个功能,是不是得在轮转之后加上压缩功能,再后面,是不是得加上搬运到冷存功能,再后面...
piapia123
2022-12-07 16:48:53 +08:00
golang 标准库准备在近期版本加入一个结构化日志库 slog ,可以关注下
SingeeKing
2022-12-07 17:04:11 +08:00
Livid
2022-12-07 17:05:59 +08:00
@SingeeKing OP 输入的 Markdown 语法的链接没有加 scheme
yuancoder
2022-12-07 17:29:42 +08:00
@SingeeKing markdown 写反了 [哭了]

@piapia123 研究研究

@polythene 这就复杂了 [二哈]

@adoal 你说的有道理,我遇到的情况是,小公司的运维根本就不管这个。
lizhenda
2022-12-08 10:48:58 +08:00
@piapia123 真的吗。那可以不用第三方了。目前用的 zerolog
Reid
2022-12-08 11:43:27 +08:00
官方的已经在实验阶段了,https://github.com/golang/go/issues/56345
jxia
2022-12-12 14:39:06 +08:00
@lizhenda 欢迎使用 https://github.com/gookit/slog

一个易于使用的,轻量级、可配置、可扩展的日志库。支持多个级别,输出到多文件;内置文件日志处理、自动切割、清理、压缩等增强功能

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

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

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

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

© 2021 V2EX