Python регистрирует несколько файлов с использованием одного и того же регистратора

Это мой сценарий: я хочу регистрировать активность my_module. Это необходимо сделать в зависимости от выполняемого метода (скажем, INPUT и OUTPUT) для двух разных файлов.

Итак, у меня есть два обработчика, каждый из которых указывает на отдельный файл (my_in_.log & my_out_.log) с одинаковым уровнем журнала. Я хотел бы знать, могу ли я использовать один и тот же регистратор для этого или мне нужно определить два регистратора. Моя конфигурация :

[loggers]
keys=root, my_log

[handlers]
keys=my_in_hand, my_out_hand

[formatters]
keys=generic_form


...


[logger_my_log]
level=NOTSET
handlers=my_in_hand, my_out_hand
qualname=ws_log

[handler_my_in_hand]
class=handlers.TimeRotatingFileHandler
level=NOTSET
formatter=generic_form
args=('my_in_.log', 'h', 1, 0, None, False, True)

[handler_my_out_hand]
class=handlers.TimeRotatingFileHandler
level=NOTSET
formatter=generic_form
args=('my_out_.log', 'h', 1, 0, None, False, True)

Нужно ли определять регистратор для каждого обработчика/адресата (потому что я хочу записывать различную информацию в разные файлы)? Есть ли способ указать регистратору, какой обработчик будет делать это? Я имею в виду, у меня есть два обработчика для одного регистратора, затем выбираю только один обработчик для регистрации одного метода.

Ответ 1

Наконец, я решил определить два регистратора, потому что:

  • Они предназначены для разных целей. В моем случае один запрос ввода журнала на веб-службу, а другой регистрирует ответ. И они используют в нем разные файлы.

  • Я использую конфигурационный файл журнала в лобной веб-службе. Добавление/удаление обработчиков перед протоколированием сообщений не является правильным подходом, как сказал @mike. спасибо to @drekyn тоже!

Вот мой конфигурационный файл журнала, только для справки, если кто-то заинтересован в:

[loggers]
keys=root, ws_in_log, ws_out_log

[handlers]
keys=consoleHandler, ws_in_hand, ws_out_hand

[formatters]
keys=generic_form

[logger_root]
handlers=consoleHandler
level=NOTSET

[logger_ws_in_log]
level=NOTSET
handlers=ws_in_hand
qualname=ws_in_log

[logger_ws_out_log]
level=NOTSET
handlers=ws_out_hand
qualname=ws_out_log

[handler_ws_in_hand]
class=logging.handlers.TimedRotatingFileHandler
level=NOTSET
formatter=generic_form
args=('/path/ws_in_.log', 'h', 1, 0, None, False, True)

[handler_ws_out_hand]
class=logging.handlers.TimedRotatingFileHandler
level=NOTSET
formatter=generic_form
args=('/path/em/ws_out_.log', 'h', 1, 0, None, False, True)

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=generic_form
args=(sys.stdout,)

[formatter_generic_form]
format='%(asctime)s - %(levelname)s - %(message)s'
datefmt='%Y-%m-%d %H:%M:%S'
class=

Увидимся!

Ответ 2

Вы должны создать экземпляр обработчика для каждого адресата, к которому вы хотите отправить свой журнал, а затем добавить 2 обработчика к вашему регистратору. Следующее должно работать (не проверял его):

logger = logging.getLogger()
handler1 = logging.TimedRotatingFileHandler()
handler2 = logging.TimedRotatingFileHandler()
logger.addHandler(handler1)
logger.addHandler(handler2)

Конечно, добавьте все параметры конфигурации и форматирования, которые могут вам понадобиться. В основном это просто показать вам, что при создании экземпляра обработчика ведения журнала вы можете добавить его в регистратор. С этого момента ваши записи журнала будут отправляться каждому обработчику, добавленному в регистратор.

Ответ 3

то, что вы хотите, это

  • создать 2 регистратора NON ROOT.
  • сделать обработчик для каждого из них, указать на другой файл
  • добавить обработчик в соответствующий логгер

    logger1 = logging.getLogger('general_logger')
    logger2 = logging.getLogger('some_other_logger')
    
    log_handler1 = logging.handlers.RotatingFileHandler(file_1, *args)
    log_handler2 = logging.handlers.RotatingFileHandler(file_2, *args)
    
    logger1.addHandler(log_handler1)
    logger2.addHandler(log_handler2)
    

затем

    logger1.info("this will be logged to file_1 ")
    logger2.info("this will be logged to file_2 ")

Обратите внимание, что если вы создаете регистратор ROOT и другой регистратор, корневой журнал регистрирует все, что этот другой контроллер пытается зарегистрировать.

Другими словами, если

    root_logger = logging.getLogger()
    logger2 = logging.getLogger('some_other_logger')

    root_log_handler = logging.handlers.RotatingFileHandler(file_1, *args)
    log_handler2 = logging.handlers.RotatingFileHandler(file_2, *args)

    root_logger.addHandler(root_log_handler)
    logger2.addHandler(log_handler2)

затем

    root_logger.info("this will be logged to file_1 ")
    logger2.info("this will be logged to file_1 AND file_2 ")

Ответ 4

У меня тоже есть похожая проблема. Используя вышеописанный регистратор, в любой момент времени файлы ws_in_.log и ws_out_.log создаются, даже если они находятся под разными обработчиками и предназначены для разных процессов. Я имею в виду, что если я запускаю процесс IN, соответствующие журналы IN регистрируются в файле ws_in.log. Но наряду с этим также создается пустой файл ws_out.log. Вы когда-нибудь замечали это? Если да, пожалуйста, помогите. Я не могу добавить комментарий, поэтому пишу в этом разделе ответов.

Спасибо и С уважением Pragyan