Python: регистрация комментариев, напечатанных на консоли, перед другими выводами - PullRequest
0 голосов
/ 16 февраля 2019

Я пытался понять логирование в python.У меня есть модуль init , два других модуля и основной модуль.По какой-то причине, когда я запускаю свой модуль, данные журнала пересекают поток кода и печатаются первыми перед другими выходными данными

Может кто-нибудь сказать мне, почему это происходит

это в __init__.py

from dir1.mod1 import FirstClass
from dir1.mod2 import SecondClass

logger = logging.getLogger(__name__)

logger.setLevel(logging.DEBUG)
f_handler=logging.FileHandler('python_logs.log')
f_handler.setLevel(logging.DEBUG)
c_handler = logging.StreamHandler()
c_handler.setLevel(logging.ERROR)

f_formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
c_formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s')

f_handler.setFormatter(f_formatter)
c_handler.setFormatter(c_formatter)

logger.addHandler(f_handler)
logger.addHandler(c_handler)

Это в двух других модулях (записано внутри __init__() класса соответственно

self.logger = logging.getLogger(__name__)

фрагмент функции addn (), определенной внутри одного из модулей

def addn(self):
    z=self.x +self.y
    print('sum is '+z)
    self.logger.error('incrementing number!')
    self.logger.info('Still incrementing number!!')
    return z

И у моих основных модулей (которые я запускаю) есть это:

from dir1.mod1 import FirstClass
from dir1.mod2 import SecondClass

number = FirstClass(2,2)
print('addition results')
number.addn()

Я ожидал вывода, как показано ниже

результаты сложения

сумма равна 3

dir1.mod1 - ОШИБКА - увеличивающийся номер!

Но я получил

dir1.mod1 - ОШИБКА -инкрементное число!

dir1.mod1 - ОШИБКА - инкрементное число!

результаты сложения:

сумма равна 3

Почему сообщение журнала печатается при первом скачкевне потока кода? А также кто-то может сказать мне, почему сообщение журнала печатается дважды ??

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Python StreamHandler будет входить в stderr по умолчанию, пока вы печатаете операторы, переходите в stdout.Это два разных конвейера, и порядок между ними не гарантирован.

Чтобы обеспечить правильное начало заказа, отправив все выходные данные в один и тот же канал.Например, вы можете добавить аргумент file=sys.stderr в свои операторы печати. ​​

0 голосов
/ 16 февраля 2019

U может попытаться отключить свойство распространения вашего регистратора.

Распространение : Если этот атрибут имеет значение true, события, зарегистрированные в этом регистраторе, будут переданы обработчикамрегистраторы более высокого уровня (предка), в дополнение к любым обработчикам, подключенным к этому регистратору.Сообщения передаются непосредственно обработчикам регистраторов предков - ни уровень, ни фильтры рассматриваемых регистраторов предков не рассматриваются.

Это пример регистратора инициализации, который использует файл и стандартный вывод с различным уровнем отладки.:

def init_logger_singleton():

    global logger

    logger = logging.getLogger(name='loggerName')
    logger.propagate = False
    logger.setLevel(10)
    formatter = logging.Formatter(
        '\t%(message)s'
    )

    filehandler = logging.StreamHandler()
    filehandler.setLevel(40)
    filehandler.setFormatter(formatter)
    logger.addHandler(filehandler)

Я использовал число для определения уровня журнала, но 10 = DEBUG и 40 = ERRO.Больше информации на этой ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...