5

设计一个 go 的日志库

 1 year ago
source link: https://www.v2ex.com/t/900805
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  Go 编程语言

设计一个 go 的日志库

  yuancoder · 1 小时 35 分钟前 · 425 次点击

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

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

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

ylog 日志库特点:

  • 支持日志级别
  • 支持按日期旋转文件
  • 支持 json 格式
  • 支持自定义格式和输出
  • 代码测试覆盖率 100%
  • 线程安全的
  • 超越 sirupsen/logrus 日志库的性能

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

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

14 条回复    2022-12-07 17:04:11 +08:00
adoal

adoal      1 小时 19 分钟前

其实大多时候打到 syslog 去让 rsyslogd 和 logrotate 去处理日志运维的杂事(比如切分)就够用了。

哦,用 Windows 的请直接无视我。
adoal

adoal      1 小时 16 分钟前

另,以上不针对功能性的轮子。只针对日志切分、旋转这种运维性质的杂活。
0o0O0o0O0o

0o0O0o0O0o      1 小时 12 分钟前

感觉维基百科译作日志轮替比日志旋转好理解很多
yuancoder

yuancoder      1 小时 11 分钟前

@adoal logrus 的作者也是这么想的,可现实不是这样的
janxin

janxin      1 小时 6 分钟前

额,标准库马上要加日志库了...
zhengjianyang

zhengjianyang      1 小时 3 分钟前

标准库不是要有了吗
adoal

adoal      57 分钟前   ❤️ 1

@yuancoder 那有什么必须的理由把 rotation 做成 application 的一部分而不是外部功能呢?

作为一个运维人员,我想到用外部功能来做的主要理由是,logging 虽然不属于业务功能,但毕竟还是应用系统的一部分,属于业务发出的动作,而 rotation 则完全和业务无关,是“带外”操作,其逻辑本身就是外部化的。rotation 跟业务逻辑没有什么必然关系,生产环境所要维护的 rotation 操作,外部化之后,可以用专门做 rotation 的组件来配置足够复杂和灵活的处理规则,这些没必要让做开发的角色来操心。这种解耦有利于业务程序员和基建运维发挥各自的长处,各司其职,而不是业务程序员操心基建开发,在“进程内”造轮子,运维又要学习一堆繁杂但又不见得比现有成熟基建更强大的专用配置来吐槽。
paccco

paccco      52 分钟前

@adoal #7 完全同意,这样增加了运维的复杂度
adoal

adoal      51 分钟前

另外,不是说日志库完全不需要考虑 rotation 。只要留个操作,可以 reopen 当前的日志文件就行了。外部 rotation 工具在移动日志文件后往进程传一个 rotation 指示(比如 kill -HUP ),进程收到后 reopen 日志文件,就写到新的文件里去了。而不需要在日志库里对日志文件的更替做定时管理。日志库里要再加上这个功能,那又要牵扯到定时任务管理,更加复杂了。
qW7bo2FbzbC0

qW7bo2FbzbC0      45 分钟前

我觉得 logrus 适合用在脚本或者小工具上,大点的项目我用 zap 更多点
adoal

adoal      35 分钟前

再比如,用 logrotate ,我可以配置 pre 和 post 脚本,在 rotate 动作的前后做一些处理。

而 rotate 功能做在 application 内部了,怎么办呢?让写 application 的业务开发团队加这个功能,然后业务开发再去推写 log 库的人加这个功能?就算实现了,谁能保证专注于写业务的开发团队顺手做的能比人家 logrotate 一心一意做了这么多年积累下来的经验更可靠?那我当然是希望业务开发团队不要操心这些事情。
polythene

polythene      25 分钟前

下一个功能,是不是得在轮转之后加上压缩功能,再后面,是不是得加上搬运到冷存功能,再后面...
piapia123

piapia123      16 分钟前

golang 标准库准备在近期版本加入一个结构化日志库 slog ,可以关注下

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK