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

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

  •  
  •   Buffer2Disk · 148 天前 · 2436 次点击
    这是一个创建于 148 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,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
        1
    rrfeng   148 天前
    各种类库一般都支持设置 logger 的,如果它真的不支持,那就没办法了。
        2
    Buffer2Disk   148 天前
    @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   148 天前
    没法统一,,,,不同的程序猿有自己的想法
        4
    TypeErrorNone   148 天前
    https://github.com/kangkang66/pkg
    zap 日志,可以输出到多端
        5
    HarrisonZ   148 天前
    klog
        6
    skiy   148 天前 via Android
    beego 的 log 可以。就是有点大
        7
    katsusan   148 天前
    第三方库的日志也是输出到 stdout,stderr 的,把 os.Stdout, os.Stderr 也重定向到你的日志流试试看,本质上都差不多啦
        8
    Buffer2Disk   148 天前
    @TypeErrorNone 这个看起来还不错,还有自动切割日志的轮子
    我看了下 demo,是只能重定向 error 级别的日志嘛?
        9
    Buffer2Disk   148 天前
    @TypeErrorNone

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

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

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

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