我有数百个子程序使用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包还负责缓冲还是直接写入文件?
答案 0 :(得分:16)
我真的可以推荐阅读文档:
Logger表示一个活动的日志记录对象,它为io.Writer生成输出行。每个日志记录操作只对Writer的Write方法进行一次调用。 Logger可以同时使用多个goroutine;它保证序列化对Writer的访问。
答案 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。