2014-03-31 50 views
7

我有數百個使用log.Println()寫入日誌文件的子例程
我正在使用log.Println寫入error.log文件。
Golang:是否使用log.Println登錄到文件中併發訪問

func main() { 
    e, err := os.OpenFile("error.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) 
    if err != nil { 
    fmt.Printf("error opening file: %v", err) 
    os.Exit(1) 
    } 
    defer e.Close() 
    errLog := log.New(e, ">>>", log.Ldate|log.Ltime) 

    for i:=0; i<500; i++ { 
     go worker(errLog) 
    } 
} 

func worker(errLog log.Logger) { 
    // Do some work 
    errLog.Println("Hello world!!!") 
} 

我的方法是否正確?還是應該使用通道來確保一次只有一個進程正在登錄文件,還是需要通過日誌包來處理?

此外,日誌包是否負責緩衝或直接寫入文件?

回答

14

log.go

func (l *Logger) Output(calldepth int, s string) error { 
    now := time.Now() // get this early. 
    var file string 
    var line int 
    l.mu.Lock() 
    defer l.mu.Unlock() 
    // ... Rest omitted 

由於幾乎所有的包log輸出功能經過Output,並有在Output互斥它的安全,說他們是併發安全。

16

我確實可以推薦閱讀文檔:

記錄器表示產生於io.Writer輸出的線的有源日誌對象。每個日誌記錄操作都會對Writer的Write方法進行一次調用。記錄器可以在多個goroutines中同時使用;它保證序列化對Writer的訪問。

http://golang.org/pkg/log/#Logger

+1

喔我讀頂部的描述,我沒有讀到記錄儀,是我不好 –

+1

我搜索「同時」,因爲大多數的包似乎關於安全使用的「併發夠程」發表評論。我錯過了這個,因爲我並不期望「同時」成爲搜索詞。 – carbocation

相關問題