2013-01-10 130 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