2013-01-10 122 views
2

我发现log4go包不时会丢失日志。log4go的异常行为

下面是一个简单的代码片段(I移动的log4go目录,以便下面的导入是确定。):

package main 
import (
    "log4go" 
    "log" 
    "fmt" 
) 

func main() { 
    fmt.Println("fmt") 
    log.Println("log") 
    log4go.Info("log4go") 
    log4go.Info("log4go") 
} 

然后,我通过go run test.go执行它,并输出如下:

fmt 
2013/01/10 15:24:04 log 

log4go的消息未写入输出。

为什么?

回答

2

在检查了log4go网站上的问题之后,看起来log4go有冲突问题。

因为它使用channel写入文件,如果main退出太快,日志内容将不会被写入。

因此,在代码片段的末尾添加time.Sleep(time.Second)将导致日志内容刷新。

+0

是,log4go,确实有这个平齐错误。但我使用'os.Stdout.Sync()'仍然不行,但使用你的方法,添加'time.Sleep(100 * time.Millisecond)',然后修复我的问题,非常感谢!对于其他人,可以参考我的帖子:[log4go不显示日志信息或仅部分显示](http://www.crifan.com/go_language_log4go_only_output_part_info/) – crifan

1

即使没有提供至少一个链接到“log4go”,回答这个问题并不容易(因此-1),所以让我猜测:在某处可能会丢失对'flush'的调用。也许最好向包装作者(s)报告问题?

BTW:考虑到标准/推荐的Go设置,导入路径“log4go”也被打破。

3

编辑:看来他们的入门页面不再是最新的,其实我的问题越来越log4go打印到标准输出的,在文档的版本3.0.1他们的状态:

  • 使用说明: - ConsoleLogWriter不会将消息的来源显示到标准输出,但FileLogWriter可以。

这是我的箱子上不可重现的。将它打印到stdout的唯一方法是在记录调用后通过调用os.Stdout.Sync()手动刷新(如@jnml建议的那样)。

一般来说,我的印象是log4go的文档最近没有维护,这些例子不起作用,它们使用不推荐使用的方法,因此一般行为很难理解。

0

简单地将一些代码添加到Close()中,如下所示。

for i := 10; i > 0 && len(w.rec) > 0; i-- { 
    time.Sleep(100 * time.Millisecond) 
} 

在w.rec中有一些rec没有被保存。

https://github.com/ccpaging/log4go