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

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

  •  
  •   Buffer2Disk · 2019-07-11 17:37:55 +08:00 · 6140 次点击
    这是一个创建于 1987 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    20 条回复    2019-07-23 09:10:12 +08:00
    rrfeng
        1
    rrfeng  
       2019-07-11 17:40:24 +08:00
    各种类库一般都支持设置 logger 的,如果它真的不支持,那就没办法了。
    Buffer2Disk
        2
    Buffer2Disk  
    OP
       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
        3
    dabaibai  
       2019-07-11 18:01:34 +08:00
    没法统一,,,,不同的程序猿有自己的想法
    TypeErrorNone
        4
    TypeErrorNone  
       2019-07-11 18:03:13 +08:00
    https://github.com/kangkang66/pkg
    zap 日志,可以输出到多端
    HarrisonZ
        5
    HarrisonZ  
       2019-07-11 18:25:26 +08:00
    klog
    skiy
        6
    skiy  
       2019-07-11 18:33:02 +08:00 via Android
    beego 的 log 可以。就是有点大
    katsusan
        7
    katsusan  
       2019-07-11 19:12:59 +08:00
    第三方库的日志也是输出到 stdout,stderr 的,把 os.Stdout, os.Stderr 也重定向到你的日志流试试看,本质上都差不多啦
    Buffer2Disk
        8
    Buffer2Disk  
    OP
       2019-07-11 21:37:16 +08:00
    @TypeErrorNone 这个看起来还不错,还有自动切割日志的轮子
    我看了下 demo,是只能重定向 error 级别的日志嘛?
    Buffer2Disk
        9
    Buffer2Disk  
    OP
       2019-07-11 21:46:55 +08:00
    @TypeErrorNone

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

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

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

    只能先注释掉 Linux 才能本地调试。。。。也是有点醉
    jinliming2
        17
    jinliming2  
       2019-07-12 08:08:06 +08:00 via iPhone
    @Buffer2Disk 可以写成两个文件,一个针对 linux,一个针对 windows,分别在文件开头写 //+build 语句来告诉编译器根据不同平台编译不同文件。
    可以参考标准库的实现。
    hellodudu86
        18
    hellodudu86  
       2019-07-12 13:34:29 +08:00
    logrus
    hellodudu86
        19
    hellodudu86  
       2019-07-12 13:35:47 +08:00
    试试 1w star 的 logrus
    https://github.com/sirupsen/logrus
    layxy
        20
    layxy  
       2019-07-23 09:10:12 +08:00
    不可能统一吧,因为 go 不像 java,有着 log4j 这样统治级的日志框架,目前 go 的框架多,每一个领域都有很多相似品,比如 web 框架,gin,beego,echo,iris,日志框架 logrus,zap,glog,seelog 等,就像你选择 web 框架一样,很多组件开发者也会选择自己喜欢或者觉得比较好的日志框架,所以目前开发 web,你会发现控制台会有各种形式的日志,虽然很多组件可以设置日志的格式,但是太麻烦了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2731 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:10 · PVG 23:10 · LAX 07:10 · JFK 10:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.