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