2013-05-09 3 views
1

Я использую модуль logging для регистрации сообщений с сервера приложений. Более конкретно, я использую StreamHandler для регистрации сообщений в stdout/stderr и используйте Supervisord для регистрации этих сообщений в файлах (поскольку серверный процесс контролируется Supervisord).Гарантирован ли хронологический порядок протоколирования сообщений?

Мой главный вопрос: действительно ли порядок сообщений в файле журнала всегда правдиво отражает порядок выполнения кода? Например, если сообщение A: this is log msg A появляется перед сообщением B: this is log msg B в файле журнала, то можем ли мы быть на 100% уверены, что строка кода, которая регистрирует сообщение A, была выполнена перед строкой кода, который регистрирует сообщение B, даже если метки времени два сообщения в файле журнала одинаковы?

+1

Вы используете нить? Тогда да, записи журнала будут введены в файл в том порядке, в котором его испускал код. При использовании резьбы вступает в действие блокировка, и побеждает нить, у которой есть блокировка. Даже тогда сообщения журнала из того же потока никогда не будут выписаны в другом порядке, они просто будут смешиваться с сообщениями из других потоков. –

ответ

1

Вы не можете быть на 100% уверены, я уверен.

Несмотря на то, что модуль регистрации блокирует выходной файл перед записью на него, если вы используете несколько потоков или процессов, нет гарантии, что ваш код, который вызвал logging.warning("A"), или что-то действительно приобретает блокировку, если несколько других потоков пытаются выполнить то же самое примерно в то же время.

См. Также docs for logging, а также its source. Мы видим, что он использует threading.RLock, о котором the docs сказать:

Если более чем один поток блокируется в ожидании, пока блокировка не будет разблокирована, только один, в то время будет в состоянии захватить право собственности на замок. Там нет возврата в этом случае.

Мы не можем быть полностью уверены в том, какой поток сначала получает блокировку, что является проблемой.

Смежные вопросы