我正在使用配置有二极管的zerolog来防止在写入标准输出时出现竞争情况。这是我的日志设置:
consoleWriter := zerolog.ConsoleWriter{Out: os.Stdout, NoColor: *logNoColor, TimeFormat: *logDateTimeFormat}
return diode.NewWriter(consoleWriter, 1000, 10*time.Millisecond, onMissedMessages)
我从这里开始跟踪示例:zerolog documentation
最后,我将全局记录器设置为从(f)处返回的编写器:
log.Logger = zerolog.New(f).With().Timestamp().Logger()
我有一个关闭钩子(监听CTRL + C),它基本上只是在调用日志消息时写一条日志消息,并取消根上下文。使用time.after函数经过1秒后,我也在写日志消息。
当我不按CTRL + C时,应用程序将按预期运行;但是,当我在方法的1秒延迟执行之前按CTRL + C时,我得到了数据争用条件。当我删除日志语句时,问题消失了,使我相信从上方设置二极管并不能帮助防止出现竞争状况。
只是为了确保我了解golang的工作原理:
我重写了我的库并解决了问题。