MST
星途 面试题库

面试题:Go日志包自定义格式下的并发安全处理

假设你已经自定义了Go日志包的日志输出格式,在高并发场景下,可能会出现日志输出混乱的问题。阐述如何确保日志输出在自定义格式下的并发安全性,可结合`sync`包相关知识,给出优化思路及关键代码片段。
34.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

优化思路

  1. 使用sync.Mutex:在日志写入操作时加锁,防止多个协程同时写入日志导致格式混乱。
  2. 使用sync.WaitGroup:在需要等待所有日志相关操作完成的场景下,用于协调多个协程。

关键代码片段

package main

import (
    "fmt"
    "sync"
)

var (
    mu    sync.Mutex
    wg    sync.WaitGroup
    logCh = make(chan string)
)

func logWriter() {
    defer wg.Done()
    for logMsg := range logCh {
        mu.Lock()
        // 这里按照自定义格式进行日志输出,假设自定义格式是简单的前缀+消息
        fmt.Printf("[CustomFormat] %s\n", logMsg)
        mu.Unlock()
    }
}

func main() {
    wg.Add(1)
    go logWriter()

    for i := 0; i < 10; i++ {
        logMsg := fmt.Sprintf("log message %d", i)
        logCh <- logMsg
    }
    close(logCh)
    wg.Wait()
}

在上述代码中:

  1. sync.Mutex mu 用于保护日志写入操作,在每次写入日志前加锁,写入后解锁,确保同一时间只有一个协程能进行日志写入。
  2. sync.WaitGroup wg 用于等待日志写入协程完成所有日志处理。
  3. logCh 是一个通道,用于将日志消息传递给日志写入协程,解耦日志产生和日志写入操作,提高并发性能。