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

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

  •  
  •   Buffer2Disk · 4 天前 · 1411 次点击

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

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

    19 回复  |  直到 2019-07-12 13:35:47 +08:00
        1
    rrfeng   4 天前
    各种类库一般都支持设置 logger 的,如果它真的不支持,那就没办法了。
        2
    Buffer2Disk   4 天前
    @rrfeng 上面的日志是 go-sql-driver/mysql v1.4.1 打出来的,定义如下
    var errLog = Logger(log.New(os.Stderr, "[mysql] ", log.Ldate|log.Ltime|log.Lshortfile))

    我都服了,感觉 go 的日志系统有点乱七八糟的。。。每个库自己搞一套。。。。
        3
    dabaibai   4 天前
    没法统一,,,,不同的程序猿有自己的想法
        4
    TypeErrorNone   4 天前
    https://github.com/kangkang66/pkg
    zap 日志,可以输出到多端
        5
    HarrisonZ   4 天前
    klog
        6
    skiy   4 天前 via Android
    beego 的 log 可以。就是有点大
        7
    katsusan   4 天前
    第三方库的日志也是输出到 stdout,stderr 的,把 os.Stdout, os.Stderr 也重定向到你的日志流试试看,本质上都差不多啦
        8
    Buffer2Disk   4 天前
    @TypeErrorNone 这个看起来还不错,还有自动切割日志的轮子
    我看了下 demo,是只能重定向 error 级别的日志嘛?
        9
    Buffer2Disk   4 天前
    @TypeErrorNone

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

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

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

    只能先注释掉 Linux 才能本地调试。。。。也是有点醉
        17
    jinliming2   3 天前 via iPhone
    @Buffer2Disk 可以写成两个文件,一个针对 linux,一个针对 windows,分别在文件开头写 //+build 语句来告诉编译器根据不同平台编译不同文件。
    可以参考标准库的实现。
        18
    hellodudu86   3 天前
    logrus
        19
    hellodudu86   3 天前
    试试 1w star 的 logrus
    https://github.com/sirupsen/logrus
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   988 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 23ms · UTC 18:30 · PVG 02:30 · LAX 11:30 · JFK 14:30
    ♥ Do have faith in what you're doing.