在Golang中,可以使用sync.Mutex
或sync.RWMutex
來實現多線程安全的日志寫入。這里是一個簡單的示例,展示了如何使用sync.Mutex
實現多線程安全的日志寫入:
package main
import (
"fmt"
"log"
"os"
"sync"
"time"
)
type Logger struct {
mu sync.Mutex
logger *log.Logger
}
func NewLogger() *Logger {
return &Logger{
logger: log.New(os.Stdout, "", log.LstdFlags),
}
}
func (l *Logger) Log(message string) {
l.mu.Lock()
defer l.mu.Unlock()
l.logger.Println(message)
}
func main() {
logger := NewLogger()
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
logger.Log(fmt.Sprintf("Log message %d from goroutine %d", i, i))
}(i)
}
wg.Wait()
}
在這個示例中,我們創建了一個Logger
結構體,它包含一個sync.Mutex
和一個log.Logger
。Log
方法使用互斥鎖來確保在同一時間只有一個goroutine可以訪問log.Logger
實例。這樣,我們就可以在多個goroutine中安全地寫入日志。
注意:在實際應用中,你可能需要根據需求調整日志級別、格式等設置。此外,還可以考慮使用第三方日志庫,如logrus
或zap
,它們通常已經實現了多線程安全的日志寫入。