Я использую нольолог с диодами, чтобы предотвратить состояние гонки при записи в стандартный вывод. Это моя настройка журнала:
consoleWriter := zerolog.ConsoleWriter{Out: os.Stdout, NoColor: *logNoColor, TimeFormat: *logDateTimeFormat}
return diode.NewWriter(consoleWriter, 1000, 10*time.Millisecond, onMissedMessages)
Я следую приведенному ниже примеру: Документация Zerolog
Наконец, я установил глобальный регистратор с записывающим устройством, возвращенным сверху(f):
log.Logger = zerolog.New(f).With().Timestamp().Logger()
У меня есть ловушка отключения (прослушивает CTRL + C), которая в основном просто записывает сообщение журнала при его вызове и отменяет корневой контекст. Я также пишу сообщение в журнале по истечении 1 секунды, используя функцию time.After.
Когда я не нажимаю CTRL + C, приложение работает должным образом;однако, когда я нажимаю CTRL + C до 1-секундного отложенного выполнения метода, я получаю условие гонки данных. Когда я удаляю операторы журнала, проблема исчезает, заставляя меня поверить, что установка диода сверху не помогает предотвратить состояние гонки.
Просто чтобы убедиться, что я понимаю, как работает golang:
- Отмена контекста высвобождает ресурсы, связанные с этим контекстом. То есть. если у вас есть дочерний контекст с каналом и вы закрываете дочерний контекст, только этот канал будет закрыт / освобожден
- os.Stdout, os.Stderr и т. д. не являются поточно-ориентированными, и операции над ними должны бытьконтролируется разработчиком.
- Я могу проверить, выполнен ли контекст Done () из многочисленных программ без проблем с синхронизацией. Тем не менее, я могу и должен читать только канал из одного потока