V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
yuancoder
V2EX  ›  Go 编程语言

设计一个 go 的日志库

  •  
  •   yuancoder · 2022-12-07 15:29:16 +08:00 · 2025 次点击
    这是一个创建于 503 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    ylog 日志库特点:

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

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

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

    19 条回复    2022-12-12 14:39:06 +08:00
    adoal
        1
    adoal  
       2022-12-07 15:45:46 +08:00
    其实大多时候打到 syslog 去让 rsyslogd 和 logrotate 去处理日志运维的杂事(比如切分)就够用了。

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

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

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

    @piapia123 研究研究

    @polythene 这就复杂了 [二哈]

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

    一个易于使用的,轻量级、可配置、可扩展的日志库。支持多个级别,输出到多文件;内置文件日志处理、自动切割、清理、压缩等增强功能
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1120 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:43 · PVG 06:43 · LAX 15:43 · JFK 18:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.