关于 zap 的使用方法问题

2021-04-18 01:37:14 +08:00
 pangtianyu

我想用 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,然后根据不同的类型写入不同文件。

2647 次点击
所在节点    Go 编程语言
15 条回复
Trim21
2021-04-18 05:13:23 +08:00
可以自己写一个输出方式的(我忘了 zap 管这个叫啥了),根据不同类型的 record 输出到不同的文件。我之前写过一个输出到 Redis 的宫女,输出到不同文件应该也可以做到
pangtianyu
2021-04-18 09:00:49 +08:00
@Trim21 #1 对 我就想知道这个叫啥,关键字是啥……
jinqzzz
2021-04-18 09:05:04 +08:00
@pangtianyu 没用过 zap,不过这种一般会搜 golang zap loglevel?
pangtianyu
2021-04-18 10:12:53 +08:00
@jinqzzz #3
我搜过 zap log different levels to separate files 之类的,但没有找到我想要的……
warlock
2021-04-18 10:21:43 +08:00
可以试试 通过 zapcore.NewTee 包含多个 core 每个 core 使用不同的 LevelEnabler
ysicing
2021-04-18 11:18:50 +08:00
多个 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
2021-04-18 11:19:17 +08:00
我现在也是 new 了一个 core 的 slice,然后 NewTee 把这个 slice 加进去
pangtianyu
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
2021-04-18 15:55:49 +08:00
@pangtianyu 我现在没有测试环境,你试试每个 file,分别实现一下 LevelEnabler 接口,只有你想输出的那个 level 才返回 true
ZSeptember
2021-04-18 15:58:07 +08:00
自定义一个 Core,可以设置 level 就可以了
maocat
2021-04-18 16:34:21 +08:00
上面都差多都说完了

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

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

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

设置 LogDirs 时会将所有的日志级别分开存储

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

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

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

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

© 2021 V2EX