go 的日志输出如何做到统一?

2019-07-11 17:37:55 +08:00
 Buffer2Disk

如题,Logger 自己定义的

Logger = log.New(wrt, "[INFO]", flag)

用 io.MultiWriter 把日志重定向到文件中去了,

但是发现一些第三方的库的日志还是在控制台来打印的,这些日志是如何能控制呢

比如下面这种日志

[mysql] 2019/07/11 17:15:00 packets.go:36: read tcp 1.1.1.1:13089-> 2.2.2.2:3306: read: connection reset by peer

有种方法是运行的时候就重定向到文件中去 , 比如 ./*** >> out.log

但是感觉这样不太优雅,有没有办法在代码里面就能控制所有日志输出的路径的?

6139 次点击
所在节点    Go 编程语言
20 条回复
rrfeng
2019-07-11 17:40:24 +08:00
各种类库一般都支持设置 logger 的,如果它真的不支持,那就没办法了。
Buffer2Disk
2019-07-11 17:47:04 +08:00
@rrfeng 上面的日志是 go-sql-driver/mysql v1.4.1 打出来的,定义如下
var errLog = Logger(log.New(os.Stderr, "[mysql] ", log.Ldate|log.Ltime|log.Lshortfile))

我都服了,感觉 go 的日志系统有点乱七八糟的。。。每个库自己搞一套。。。。
dabaibai
2019-07-11 18:01:34 +08:00
没法统一,,,,不同的程序猿有自己的想法
TypeErrorNone
2019-07-11 18:03:13 +08:00
https://github.com/kangkang66/pkg
zap 日志,可以输出到多端
HarrisonZ
2019-07-11 18:25:26 +08:00
klog
skiy
2019-07-11 18:33:02 +08:00
beego 的 log 可以。就是有点大
katsusan
2019-07-11 19:12:59 +08:00
第三方库的日志也是输出到 stdout,stderr 的,把 os.Stdout, os.Stderr 也重定向到你的日志流试试看,本质上都差不多啦
Buffer2Disk
2019-07-11 21:37:16 +08:00
@TypeErrorNone 这个看起来还不错,还有自动切割日志的轮子
我看了下 demo,是只能重定向 error 级别的日志嘛?
Buffer2Disk
2019-07-11 21:46:55 +08:00
@TypeErrorNone

不过你发的这个,好像也没办法限制第三方库的怎么打日志的行为啊,
只能控制自己怎么打日志输出到文件
gamexg
2019-07-11 21:49:17 +08:00
你看下他用的什么日志库,如果是标准库的日志库那么去修改配置就行。
如果不好解决,那么只能考虑用代码重定向标准输出了。
rrfeng
2019-07-11 22:04:07 +08:00
我的意思是这些库都提供了 logger 接口,你把自定义的 logger 提供给他他就往你指定的地方输出了。

当然没提供的也有,高质量库都会有的。
Buffer2Disk
2019-07-11 22:08:48 +08:00
@katsusan 是的,那只有捕获一下 Stderr 的日志,重定向到日志了。但是估计要区分 Linux,和 windows 平台的差别了
eslizn
2019-07-11 22:15:54 +08:00
原罪是官方只提供了 struct Logger 而不是一个 interface,并且这个 logger 极其难用和定制
eslizn
2019-07-11 22:16:19 +08:00
可以试试 zlog
xfriday
2019-07-11 22:32:23 +08:00
日志又不是协议,干嘛要统一?是不是管的太多了?
Buffer2Disk
2019-07-11 22:48:09 +08:00
@katsusan 试了下重定向确实成功了,
但是 windows(本地开发环境)上重定向的代码和 Linux(线上环境)上的是不同的(不兼容),

然后 windows 机器上调试代码的话,Linux 那一段重定向的代码直接被编译器标红了,编译都不能通过 = = ,

只能先注释掉 Linux 才能本地调试。。。。也是有点醉
jinliming2
2019-07-12 08:08:06 +08:00
@Buffer2Disk 可以写成两个文件,一个针对 linux,一个针对 windows,分别在文件开头写 //+build 语句来告诉编译器根据不同平台编译不同文件。
可以参考标准库的实现。
hellodudu86
2019-07-12 13:34:29 +08:00
logrus
hellodudu86
2019-07-12 13:35:47 +08:00
试试 1w star 的 logrus
https://github.com/sirupsen/logrus
layxy
2019-07-23 09:10:12 +08:00
不可能统一吧,因为 go 不像 java,有着 log4j 这样统治级的日志框架,目前 go 的框架多,每一个领域都有很多相似品,比如 web 框架,gin,beego,echo,iris,日志框架 logrus,zap,glog,seelog 等,就像你选择 web 框架一样,很多组件开发者也会选择自己喜欢或者觉得比较好的日志框架,所以目前开发 web,你会发现控制台会有各种形式的日志,虽然很多组件可以设置日志的格式,但是太麻烦了

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

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

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

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

© 2021 V2EX