温馨提示×

Linux Golang日志如何实现多线程安全

小樊
36
2025-11-29 12:45:39
栏目: 编程语言

在Golang中,我们可以使用内置的"sync"包来实现多线程安全。对于日志记录,我们可以使用"sync.Mutex"来确保在同一时间只有一个goroutine可以访问日志记录器。下面是一个简单的示例:

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。我们为Logger结构体定义了一个Log方法,该方法首先锁定互斥锁,然后记录消息,最后解锁互斥锁。这样可以确保在同一时间只有一个goroutine可以访问日志记录器。

main函数中,我们创建了一个Logger实例,并启动了10个goroutine来记录日志。我们使用sync.WaitGroup来等待所有goroutine完成。这样,我们可以确保在程序退出之前所有日志都已记录。

这个示例展示了如何在Golang中实现多线程安全的日志记录。你可以根据自己的需求对其进行修改和扩展。

0