Вы, вероятно, проблема стандартных потоков . По умолчанию print
использует std::out
, а logger.info
использует std::err
. Оба потока связаны с вашим терминалом , но они могут иметь различные flush
обновления или триггеры.
Вот почему ваши выходы смешиваются, функции записывают в разные потоки, и они выводятся по-разному на терминал, что приводит к очевидному противоречивому результату.
Изменение вашего первого кода, чтобы logger.info
использовал тот же поток, что и print
, решило вашу проблему:
import sys
stream_handler = logging.StreamHandler(sys.stdout)
Теперь он возвращает правильный вывод:
-- Starting loop number 0
04/06/2019 - 07:41:34 AM - INFO - root - loop number 0
04/06/2019 - 07:41:34 AM - INFO - root - loop number 0
-- Finished loop number 0
-- Starting loop number 1
04/06/2019 - 07:41:34 AM - INFO - root - loop number 1
04/06/2019 - 07:41:34 AM - INFO - root - loop number 1
-- Finished loop number 1
-- Starting loop number 2
04/06/2019 - 07:41:34 AM - INFO - root - loop number 2
04/06/2019 - 07:41:34 AM - INFO - root - loop number 2
-- Finished loop number 2
-- Starting loop number 3
04/06/2019 - 07:41:34 AM - INFO - root - loop number 3
04/06/2019 - 07:41:34 AM - INFO - root - loop number 3
-- Finished loop number 3
Поскольку и print
, и logger.info
подают один и тот же поток в правильном порядке всякий раз, когда он сбрасывается на ваш терминал, результат правильный.
Вы также можете сохранить различных потоков и принудительно заставить std::out
поток очищаться явно :
def main():
for i in range(10):
print('-- Starting loop number {}'.format(i))
# Force std::out stream (fed by print) to be flushed to the terminal
# before logger feeds std::err and also flushes
sys.stdout.flush()
loggerA.info("loop number {}".format(i))
loggerB.info("loop number {}".format(i))
print('-- Finished loop number {}'.format(i))
sys.stdout.flush()
Эта вторая версия также дает ожидаемый результат.
Также помните, что logger
по определению поточно-безопасен , но print
нет. Если вы собираетесь создать модуль с использованием потока, для отслеживания выполнения используйте только logger
.