Golang Go语言中日志输出如何做到统一?

Golang Go语言中日志输出如何做到统一?

如题,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

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


更多关于Golang Go语言中日志输出如何做到统一?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

21 回复

各种类库一般都支持设置 logger 的,如果它真的不支持,那就没办法了。

更多关于Golang Go语言中日志输出如何做到统一?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


上面的日志是 go-sql-driver/mysql v1.4.1 打出来的,定义如下
var errLog = Logger(log.New(os.Stderr, "[mysql] ", log.Ldate|log.Ltime|log.Lshortfile))

我都服了,感觉 go 的日志系统有点乱七八糟的。。。每个库自己搞一套。。。。

没法统一,不同的程序猿有自己的想法

https://github.com/kangkang66/pkg
zap 日志,可以输出到多端

beego 的 log 可以。就是有点大

第三方库的日志也是输出到 stdout,stderr 的,把 os.Stdout, os.Stderr 也重定向到你的日志流试试看,本质上都差不多啦

这个看起来还不错,还有自动切割日志的轮子
我看了下 demo,是只能重定向 error 级别的日志嘛?



不过你发的这个,好像也没办法限制第三方库的怎么打日志的行为啊,
只能控制自己怎么打日志输出到文件

你看下他用的什么日志库,如果是标准库的日志库那么去修改配置就行。
如果不好解决,那么只能考虑用代码重定向标准输出了。

我的意思是这些库都提供了 logger 接口,你把自定义的 logger 提供给他他就往你指定的地方输出了。

当然没提供的也有,高质量库都会有的。

是的,那只有捕获一下 Stderr 的日志,重定向到日志了。但是估计要区分 Linux,和 windows 平台的差别了

原罪是官方只提供了 struct Logger 而不是一个 interface,并且这个 logger 极其难用和定制

可以试试 zlog

日志又不是协议,干嘛要统一?是不是管的太多了?

试了下重定向确实成功了,
但是 windows(本地开发环境)上重定向的代码和 Linux(线上环境)上的是不同的(不兼容),

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

只能先注释掉 Linux 才能本地调试。。。。也是有点醉

可以写成两个文件,一个针对 linux,一个针对 windows,分别在文件开头写 //+build 语句来告诉编译器根据不同平台编译不同文件。
可以参考标准库的实现。

不可能统一吧,因为 go 不像 java,有着 log4j 这样统治级的日志框架,目前 go 的框架多,每一个领域都有很多相似品,比如 web 框架,gin,beego,echo,iris,日志框架 logrus,zap,glog,seelog 等,就像你选择 web 框架一样,很多组件开发者也会选择自己喜欢或者觉得比较好的日志框架,所以目前开发 web,你会发现控制台会有各种形式的日志,虽然很多组件可以设置日志的格式,但是太麻烦了

在Golang(Go语言)中,实现日志输出的统一管理是提高代码可维护性和可读性的关键步骤。以下是一些常见的实践方法:

  1. 使用标准库log: Go标准库提供了log包,可用于简单的日志记录。通过自定义日志格式、输出目的地(如文件或控制台),可以实现一定程度的统一。

  2. 引入第三方日志库: 更强大的日志管理可以通过引入第三方库来实现,如logruszapglog等。这些库提供了丰富的日志级别(如DEBUG、INFO、WARN、ERROR)、日志格式化、日志输出控制等功能,能够更灵活地满足复杂需求。

  3. 全局日志实例: 创建一个全局的日志实例,并在整个应用程序中统一使用。这可以通过单例模式或依赖注入等方式实现,确保日志记录的一致性和可配置性。

  4. 配置管理: 将日志配置(如日志级别、输出路径、格式等)统一管理,可以通过配置文件、环境变量或命令行参数进行动态调整。

  5. 上下文日志: 在日志中记录上下文信息(如请求ID、用户ID等),有助于在分布式系统中进行问题追踪和诊断。

  6. 日志轮转: 对于长时间运行的服务,日志轮转(如按大小或时间分割日志文件)是必不可少的,以避免日志文件过大导致的问题。

综上所述,通过选择合适的方法并遵循最佳实践,可以在Go语言中实现日志输出的统一管理,提高系统的可维护性和健壮性。

回到顶部