我发现很多 go 的开源项目打印日志的方法,都是用每个 struct 里面包含一个 logger 的属性,打印日志都是用自己的 logger 来打印。但是这种方式要求我在创建 struct 的时候传递一个 logger 属性(通常都是用 new 方法传递)。但是这样一级一级的往下传递 logger 看着就很烦。直接在项目里面定义一个 log 包,打印日志的时候直接引用这个 log 包来打印又简单又好。
不明白这种每个 struct 包含一个 logger 的用途好在哪里?
1
xuzhzzz 2022-08-22 17:19:20 +08:00
举个例子呗,哪个开源项目这么做的分享下
|
2
Trim21 2022-08-22 17:20:32 +08:00 via Android
方便针对每个库设置不同的日志格式 /日志等级等等
|
3
Vegetable 2022-08-22 17:39:57 +08:00
想学习一下,能举个例子吗
|
4
buddyy 2022-08-22 18:59:48 +08:00 1
手动严格执行“依赖注入”。
|
5
Maboroshii 2022-08-22 19:05:33 +08:00
方便做单元测试吧可能。。 还有数据库的连接啥的也是每个包单独搞一个实例
|
6
EminemW 2022-08-22 19:36:13 +08:00 via iPhone
通常来说,第三方库都会有 logger 默认实现吧,同时允许使用者存入自定义的 logger ,毕竟每个人用的日志库不一定是一样的
|
7
iyaozhen 2022-08-22 19:53:34 +08:00
好像没见过这样的吧。但确实 logger 不统一,每个库都是自己的,想全局设置不行
|
8
jackge0323 2022-08-22 20:43:27 +08:00
他说的好像是 kratos 框架,给的 demo 就是这么用的
|
9
nobodybutme 2022-08-22 21:18:41 +08:00
你这么类比一下,java 里每个类里写一个 private static Logger logger = LoggerFactory.getLogger(xxx.class);
不过 go 没有全局的就是了 |
10
securityCoding 2022-08-22 21:33:48 +08:00
最佳实践应该是 uber 的 zap ,拓展性无敌
|
11
wtfedc 2022-08-22 22:02:48 +08:00
logger 可以实例化,设置不同的打印格式,output 位置。
共用 logger 还有个多线程抢占的问题,你不能保证某段业务的两个相邻 log 打印掺入其他业务的 log 。 |
12
wtfedc 2022-08-22 22:04:09 +08:00
共用 logger 还有个多线程抢占的问题,你不能保证某段业务的两个相邻 log 打印不掺入其他业务的 log 。(上边给漏了个字)
|
13
janxin 2022-08-22 22:13:38 +08:00
统一的 log 包,仅提供单一的 log 功能是最基础的使用方式,如果能满足你的需求完全可以使用。标准库 log 提供的就是这个功能。
依赖注入的一种实现,优势也来自于依赖注入的优点。当然,你也可以统一,通过 ctx 之类的去区分你的实际需求。 |
14
wheeler 2022-08-23 01:31:26 +08:00 via iPhone
https://peter.bourgon.org/go-best-practices-2016/#top-tip-9
显示传递依赖方便测试,方便定制需求。 https://github.com/uber-go/zap/blob/master/FAQ.md zap 官方也是不推荐全局 logger 的。 |
15
macscsbf 2022-08-23 08:27:52 +08:00
我也是这么传递的 主要是为了每个结构体专门定制自己的 log
|
16
elegantu 2022-08-23 10:16:14 +08:00
赞同 @Maboroshii ,方便做单元测试
|
18
yujianwjj OP @elegantu @Maboroshii 方便做单元测试怎么理解?能举个例子吗?
|
19
Maboroshii 2022-08-23 13:43:02 +08:00
@yujianwjj 跑单元测试的时候,可以在测试方法内部实例出一个 logger 可以任意定义它的行为,避免初始化项目整体复杂的 logger (可能会引用第三方系统之类的操作)
|
20
777777 2022-08-23 15:15:34 +08:00
因为官方的 log 没做成 interface ,所以库给你提供一个 logger ,方便整个工程日志统一。否则每个第三方库的日志格式都不一样。
|
21
yrzs 2022-08-23 18:07:25 +08:00
@jackge0323 哈哈我现在用的就是这个
|
22
jxia 2022-08-25 10:55:56 +08:00
推荐一下日志库 https://github.com/gookit/slog
|