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

关于 zap 的使用方法问题

  •  
  •   pangtianyu · 2021-04-18 01:37:14 +08:00 · 2647 次点击
    这是一个创建于 1350 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想用 zap 来记录日志,我现在设计的是,每一种类型的日志分别用一个 logger 来记录,如下

    type Logger struct {
    	DebugLogger	*zap.Logger
    	InfoLogger	*zap.Logger
    	WarnLogger	*zap.Logger
    	ErrorLogger	*zap.Logger
    	PanicLogger	*zap.Logger
    	DPanicLogger	*zap.Logger
    	FatalLogger	*zap.Logger
    }
    

    这样我就可以用多个文件分别存放不同类型的日志了。但是我疑惑这样 performance 会不会变差。或者有没有什么方法能用一个 logger,然后根据不同的类型写入不同文件。

    第 1 条附言  ·  2021-04-19 10:57:20 +08:00
    感谢各位提供帮助。根据大家的提示,自己实现了一下,代码贴在这了。

    15 条回复    2021-04-20 17:58:05 +08:00
    Trim21
        1
    Trim21  
       2021-04-18 05:13:23 +08:00 via Android
    可以自己写一个输出方式的(我忘了 zap 管这个叫啥了),根据不同类型的 record 输出到不同的文件。我之前写过一个输出到 Redis 的宫女,输出到不同文件应该也可以做到
    pangtianyu
        2
    pangtianyu  
    OP
       2021-04-18 09:00:49 +08:00
    @Trim21 #1 对 我就想知道这个叫啥,关键字是啥……
    jinqzzz
        3
    jinqzzz  
       2021-04-18 09:05:04 +08:00 via Android
    @pangtianyu 没用过 zap,不过这种一般会搜 golang zap loglevel?
    pangtianyu
        4
    pangtianyu  
    OP
       2021-04-18 10:12:53 +08:00
    @jinqzzz #3
    我搜过 zap log different levels to separate files 之类的,但没有找到我想要的……
    warlock
        5
    warlock  
       2021-04-18 10:21:43 +08:00   ❤️ 1
    可以试试 通过 zapcore.NewTee 包含多个 core 每个 core 使用不同的 LevelEnabler
    ysicing
        6
    ysicing  
       2021-04-18 11:18:50 +08:00   ❤️ 1
    多个 core,根据不同的 Priority,使用不同的 core 和 WriteSyncer

    ```
    debugCore := zapcore.NewCore(filecoder, zapcore.NewMultiWriteSyncer(c.logfilesyncer("debug")), debugPriority)
    customCore := zapcore.NewCore(filecoder, zapcore.NewMultiWriteSyncer(c.logfilesyncer("custom")), customPriority)
    errCore := zapcore.NewCore(filecoder, zapcore.NewMultiWriteSyncer(c.logfilesyncer("err")), errPriority)
    ```
    Aresrun
        7
    Aresrun  
       2021-04-18 11:19:17 +08:00   ❤️ 1
    我现在也是 new 了一个 core 的 slice,然后 NewTee 把这个 slice 加进去
    pangtianyu
        8
    pangtianyu  
    OP
       2021-04-18 13:16:56 +08:00
    @warlock #5
    @ysicing #6
    @Aresrun #7

    我用了 zapcore.NewTee 现在能写入多个文件了,但是没办法区别不同的 level 。比如我的 debug.log 文件里面写入了所有 level 的记录,而在 error.log 里面写入了 ErrorLevel 及以上的记录。如果要想在每个文件只写入特定的某一个 level 的话,应该怎么设置这个 LevelEnabler 呢?还是应该在 WriteSyncer 这边判断过滤?
    warlock
        9
    warlock  
       2021-04-18 15:55:49 +08:00   ❤️ 1
    @pangtianyu 我现在没有测试环境,你试试每个 file,分别实现一下 LevelEnabler 接口,只有你想输出的那个 level 才返回 true
    ZSeptember
        10
    ZSeptember  
       2021-04-18 15:58:07 +08:00   ❤️ 1
    自定义一个 Core,可以设置 level 就可以了
    maocat
        11
    maocat  
       2021-04-18 16:34:21 +08:00   ❤️ 1
    上面都差多都说完了

    给个我自己自己摸索出来的封装代码

    https://gist.github.com/xcbdjazk/bd539c6aeaff90bad45f45a96d586472
    Sparkli
        12
    Sparkli  
       2021-04-18 16:38:20 +08:00
    @maocat 好奇问下,你是怎么打出 bottom 框的
    maocat
        13
    maocat  
       2021-04-18 16:40:37 +08:00
    @Sparkligist.github.com 把代码写进去,把链接贴过来就行了
    pangtianyu
        14
    pangtianyu  
    OP
       2021-04-19 11:01:58 +08:00
    @warlock #9
    @ZSeptember #10
    @maocat #11

    可以了,感谢帮助。我的代码 append 了。
    kuoruan
        15
    kuoruan  
       2021-04-20 17:58:05 +08:00
    我前段时间写了个自用的 zap wrapper,和你的实现差不多
    https://github.com/kuoruan/go-log

    设置 LogDirs 时会将所有的日志级别分开存储
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2784 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 07:42 · PVG 15:42 · LAX 23:42 · JFK 02:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.