信息发布→ 登录 注册 退出

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

发布时间:2025-04-22

点击量:

在golang中,可以使用标准库"sync"中的sync.mutex来实现多线程安全的日志记录。以下是一个简单的示例:

package main

import (
	"fmt"
	"log"
	"os"
	"sync"
	"time"
)

type Logger struct {
	mu    sync.Mutex
	logger *log.Logger
}

func NewLogger(prefix string) *Logger {
	return &Logger{
		logger: log.New(os.Stdout, prefix, log.LstdFlags),
	}
}

func (l *Logger) Log(msg string) {
	l.mu.Lock()
	defer l.mu.Unlock()
	l.logger.Println(msg)
}

func main() {
	logger := NewLogger("INFO: ")

	var wg sync.WaitGroup
	wg.Add(2)

	go func() {
		defer wg.Done()
		for i := 0; i < 5; i++ {
			logger.Log("Thread 1: Log entry " + fmt.Sprintf("%d", i))
			time.Sleep(1 * time.Second)
		}
	}()

	go func() {
		defer wg.Done()
		for i := 0; i < 5; i++ {
			logger.Log("Thread 2: Log entry " + fmt.Sprintf("%d", i))
			time.Sleep(1 * time.Second)
		}
	}()

	wg.Wait()
}

在这个示例中,我们创建了一个名为Logger的结构体,它包含一个sync.Mutex和一个log.Logger。我们为Logger结构体定义了一个Log方法,该方法在记录日志之前锁定互斥锁,并在完成后解锁。这样可以确保在多个线程中同时调用Log方法时,日志记录是线程安全的。

在main函数中,我们创建了一个Logger实例,并启动了两个goroutine,每个goroutine都会记录5条日志。由于我们在Log方法中使用了互斥锁,因此这两个goroutine可以安全地同时记录日志,而不会出现竞争条件。

标签:# golang  # ai  # 标准库  # 结构体  # 线程  # 多线程  # 是一个  # 在这个  # 互斥  # 多个  # 并在  # 这两个  # 可以使用  # 来实现  # 解锁  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!