2014-03-31 26 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

相关问题