Найти - Пользователи
Полная версия: logging, добавление не стандартного поля
Начало » Python для новичков » logging, добавление не стандартного поля
1 2
jon34
Есть задача настроить формат логирования, загвоздка заключается в том, что нужно добавить в вывод не стандартное поле.

Сейчас нашел вот такой пример в сети
 import logging
 
logger = logging.getLogger()
syslog = logging.StreamHandler()
formatter = logging.Formatter('%(service)s, %(message)s')
syslog.setFormatter(formatter)
logger.setLevel(logging.INFO)
logger.addHandler(syslog)
 
logger.error('some error', extra={'service': 'my_service'})

Этот пример работает, но мне не подходит, потому нужно всегда явно передавать данные в аргументе extra, а хочется, чтобы логгер был 1 раз настроен при старте приложения и все (В моем случае настраивается логгирование существующего сервиса и я просто не могу лазить по всему приложению и везде добавлять передачу extra. Нужно как-то настроить один раз root logger).

Подскажите пожалуйста как правильно это сделать.
Rodegast
 def error_logger(txt):
    logger.error(txt, extra={'service': 'my_service'})
jon34
Rodegast
С таким подходом нужно будет перелопачивать весь код и вставлять использование новой функции. Такой вариант не подходит по причинам описаным в первом сообщении.
PEHDOM
jon34
С таким подходом нужно будет перелопачивать весь код и вставлять использование новой функции. Такой вариант не подходит по причинам описаным в первом сообщении.
ну народ, первая же ссылка в гугле
https://stackoverflow.com/questions/17558552/how-do-i-add-custom-field-to-python-log-format-string
 import logging
extra={'service': 'my_service'}
logger = logging.getLogger()
syslog = logging.StreamHandler()
formatter = logging.Formatter('%(service)s, %(message)s')
syslog.setFormatter(formatter)
logger.setLevel(logging.INFO)
logger.addHandler(syslog)
logger = logging.LoggerAdapter(logger, extra)
logger.error('some error')
>>>
my_service, some error
>>>
jon34
PEHDOM
Видел ее, а как LoggerAdapter глобально просетить? Чтобы потом любой логгер имел эти настройки.
PEHDOM
jon34
Видел ее, а как LoggerAdapter глобально просетить? Чтобы потом любой логгер имел эти настройки.
не совсем понятно что значит “глобально”? можете пояснить на примере?
Rodegast
> С таким подходом нужно будет перелопачивать весь код и вставлять использование новой функции.

Не нужно ничего перелопачивать. Создаёшь модуль с логгером, а потом импортируешь его с нужным именем, и всё.
 from my_logger import error_logger as logger
jon34
PEHDOM
не совсем понятно что значит “глобально”?
Я имею ввиду, что мне нужно, чтобы созданный LoggerAdapter применялся ко всем создаваемым логгерам. То есть, чтобы при вызове в другом модуле logging.getLogger() или logging.getLogger('some-logger-name') всегда возвращался логгер, который будет “знать” о имени сервиса. То есть мне нужно, чтобы все новые логгеры знали имя сервиса.
jon34
Rodegast
Не нужно ничего перелопачивать. Создаёшь модуль с логгером, а потом импортируешь его с нужным именем, и всё.
Тогда получится, что библиотеки, которые пишут логи, будут это делать в неправильном формате.
PEHDOM
jon34
Я имею ввиду, что мне нужно, чтобы созданный LoggerAdapter применялся ко всем создаваемым логгерам. То есть, чтобы при вызове в другом модуле logging.getLogger() или logging.getLogger('some-logger-name') всегда возвращался логгер, который будет “знать” о имени сервиса. То есть мне нужно, чтобы все новые логгеры знали имя сервиса.
Я бы не рекомендовал все же править модули, мало ли чего там можно поломать. Вариант предложеный Rodegast вполне себе кошерен, более детально расписано тут https://stackoverflow.com/questions/7621897/python-logging-module-globally
Выносите настройку логера в отдельный модуль и подключайте его. От вас потребуеться минимум вмешательства, при этом вы гарантировано ничего не поломаете.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB