Golang:使用log.Println登录文件会处理并发访问

Rah*_*sad 8 file-io logging buffer go

我有数百个子程序使用log.Println()写入日志文件
我使用log.Println写入error.log文件.

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!!!")
}
Run Code Online (Sandbox Code Playgroud)

我的方法是否正确?或者我应该使用通道来确保一次只有一个进程登录到文件,还是由日志包固有地处理?

log包还是负责缓冲还是直接写入文件?

Lin*_*ope 17

来自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
Run Code Online (Sandbox Code Playgroud)

由于几乎所有的包log输出函数都经过Output,并且有一个互斥锁Output可以安全地说它们是并发安全的.


Vol*_*ker 16

我真的可以推荐阅读文档:

Logger表示一个活动的日志记录对象,它为io.Writer生成输出行.每个日志记录操作只对Writer的Write方法进行一次调用.Logger可以同时使用多个goroutine; 它保证序列化对Writer的访问.

请参阅http://golang.org/pkg/log/#Logger

  • 我搜索了“并发”,因为大多数软件包似乎都评论了有关“并发 goroutine”的安全使用。我错过了这个,因为我没想到“同时”会成为搜索词。 (2认同)