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

时间:2014-03-31 10:11:30

标签: logging file-io go buffer

我有数百个子程序使用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!!!")
}

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

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

2 个答案:

答案 0 :(得分:16)

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

  

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

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

答案 1 :(得分:15)

来自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中有一个互斥锁,因此可以安全地说它们是并发的-safe。