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

log4go 打印日志 flush 问题

  •  
  •   wusuopuBUPT ·
    wusuopubupt · 2015-11-26 11:18:37 +08:00 · 1604 次点击
    这是一个创建于 3287 天前的主题,其中的信息可能已经有所发展或是发生改变。
    使用 log4go 官方提供的 example 发现,指定了 Log 文件后,运行程序并不能把 log 打印到文件,在 stackoverflow 上发现答案: http://stackoverflow.com/questions/14252766/abnormal-behavior-of-log4go , 给出的解释是 log4go 用的是 channel 暂存日志,打印会另起一个 goroutine 进行,但是主 goroutine 退出太快时,负责打印日志的 goroutine 没机会把 channel 中的日志打印出来,导致日志丢失。

    临时的解决办法: 在程序最后加上: time.Sleep(time.Second), sleep()调用会留给打印日志的 goroutine 执行的时间。

    请问各位同学,有没有什么永久性的解决办法呢?
    6 条回复    2015-11-26 19:56:19 +08:00
    zhujinliang
        1
    zhujinliang  
       2015-11-26 11:40:57 +08:00 via iPhone
    解决这个问题…是个挺麻烦的事……
    我自己写日志库时也遇到了这个问题
    如果那个库没提供“等待退出”这样的方法的话,是没有办法的

    你需要给负责打印日志工作的 goroutine 通过 channel 发送一个消息,让它主动退出,但如果传送日志的 channel 是个带缓冲带 channel 的话, goroutine 返回前还需要用 for...range 或者 for...select...default 把缓存中的日志处理完
    hhkbp2
        2
    hhkbp2  
       2015-11-26 13:29:16 +08:00
    永久解决,不如换成这个吧
    https://github.com/hhkbp2/go-logging
    yougg
        3
    yougg  
       2015-11-26 14:40:37 +08:00
    把异步写日志改成同步的, 如果你能接受性能损耗...
    Comdex
        4
    Comdex  
       2015-11-26 15:41:51 +08:00
    换个库?
    elgoog1970
        5
    elgoog1970  
       2015-11-26 17:43:39 +08:00
    ensonmj
        6
    ensonmj  
       2015-11-26 19:56:19 +08:00
    最简单的改法,把 buffer 调成非缓冲的,就变成同步的了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5882 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:37 · PVG 11:37 · LAX 19:37 · JFK 22:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.