英文:
Golang: Does logging into file using log.Println takes care of concurrent access
问题
我有数百个子程序使用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!!!")
}
我的方法正确吗?或者我应该使用通道来确保一次只有一个进程记录到文件中,或者日志包本身已经处理了这个问题?
另外,日志包是否会进行缓冲,还是直接写入文件?
英文:
I have hundreds of subroutines writing into log file using log.Println() <br>
I am using log.Println to write into error.log file. <br>
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!!!")
}
Is my approach correct ? Or should I use channel to make sure only one process is logging into file at one time or is it taken care of inherently by log package?
Also does log package takes care of buffering or it directly writes into file?
答案1
得分: 23
从 log.go 文件中:
func (l *Logger) Output(calldepth int, s string) error {
now := time.Now() // 提前获取当前时间。
var file string
var line int
l.mu.Lock()
defer l.mu.Unlock()
// ... 其余部分省略
由于几乎所有的 log
包输出函数都经过 Output
函数,并且 Output
函数中有一个互斥锁,可以说它们是并发安全的。
英文:
From 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
Since pretty much all package log
output functions go through Output
, and there's a mutex in Output
it's safe to say they're concurrency-safe.
答案2
得分: 19
我真的可以推荐阅读文档:
> Logger代表一个活动的日志对象,它会生成输出行到一个io.Writer。每个日志操作都会调用Writer的Write方法一次。一个Logger可以同时从多个goroutine中使用;它保证对Writer的访问进行序列化。
请参阅http://golang.org/pkg/log/#Logger
英文:
I really can recommend reading the documentation:
> A Logger represents an active logging object that generates lines of output to an io.Writer. Each logging operation makes a single call to the Writer's Write method. A Logger can be used simultaneously from multiple goroutines; it guarantees to serialize access to the Writer.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论