golang的log包在打开log文件的时候需要加锁吗?

package main

import "log"
import "os"
import "time"
import "sync"

func LOG(msg string, level string){
    if level == ""{
        level = "[WARNING]:"
    }
    var mu sync.Mutex
    filename := "./" + time.Now().Format("2006_01_02") + ".log"
    //mu.Lock() //要不要加这个锁?
    logfile,err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE,0666) //这里如果多个goroutine同时调用LOG函数会出错吗?
    if err != nil{
        log.Fatalln("open log file error")
    }
    logger := log.New(logfile, level, log.LstdFlags|log.Lshortfile)
    logger.Println(msg)
    logfile.Close()
    //mu.Unlock()
}

func main(){
    LOG("message", "[INFO]:")
}

我知道golang的log包是goroutine安全的,但是在log.New()文件之前需要先打开日志文件,打开日志文件这一步要不要加锁?

阅读 6.3k
3 个回答

这是我的看法:

  1. 开启一个goroutine专门从其他goroutine接受日志信息写入。
  2. 如果一定要多个goroutine来获得写句柄,是需要加互斥锁的。
  3. 不建议自己做日志系统,建议使用开源的轮子,保证项目可用性
  1. 日志数据直接写入channel,channel并发安全
  2. 新协程定期落盘,这样解决问题

按照你的写法,那肯定得加锁

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题