我有数百个子 routine 使用log.Println()
写入日志(log)文件 我正在使用log.Println写入error.log文件.

func main() {
  e, err := os.OpenFile("error.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
  if err != nil {
    fmt.Printf("error opening file: %v", err)
    os.Exit(1)
  }
  defer e.Close()
  errLog := log.New(e, ">>>", log.Ldate|log.Ltime)

  for i:=0; i<500; i++ {
      go worker(errLog)
  }
}

func worker(errLog log.Logger) {
  // Do some work 
  errLog.Println("Hello world!!!")
}

我的做法正确吗?或者,我应该使用通道来确保一次只有一个进程登录到文件中,还是应该由日志(log)包本身来处理它?

日志(log)包是负责缓冲还是直接写入文件?

推荐答案

log.go开始:

func (l *Logger) Output(calldepth int, s string) error {
   now := time.Now() // get this early.
   var file string
   var line int
   l.mu.Lock()
   defer l.mu.Unlock()
   // ... Rest omitted

因为几乎所有的包log输出函数都经过Output,并且Output中有一个互斥锁,所以可以肯定地说它们是并发安全的.

Go相关问答推荐

GORM:一个表的两个外键

如何解析Go-Gin多部分请求中的 struct 切片

关于如何使用 Service Weaver 设置多个不同侦听器的问题

如何在 zap 记录器库中使用自定义时间函数

golang testscript .txtar 语法,用于 stderr 或 stdout 中包含的文本

go-jwt 令牌验证错误 - 令牌签名无效:密钥类型无效

是否可以在调试期间在 VSCode 中预览 github.com/shopspring/decimal 值?

Golang:如何判断通过缓冲通道进行通信时生产者或消费者是否较慢?

读取非UTF8编码的文件内容并正确打印出来

具有两个或多个模型的 GORM 查询

从 Makefile 运行时权限被拒绝

每次有人进入我的网站时如何运行特定功能?

在 docker kill --signal=SIGX 上以这种方式关闭容器内运行的 go 应用程序是否安全?

此代码如何生成内存对齐切片?

无法访问 Go 模块导入的远程存储库

为什么 x/net/html Token().Attr 上的 len 在此处为空切片返回非零值?

如何在 Windows 上使用 cgo 为 386 arch 构建 lib?

GOLANG 如何使用 http.FileServer 从模板目录加载某个 html 文件

防止在 Go 公用文件夹中列出目录

Go 错误:cannot use generic type without instantiation