Форум сайта python.su
Есть задача настроить формат логирования, загвоздка заключается в том, что нужно добавить в вывод не стандартное поле.
Сейчас нашел вот такой пример в сети
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'})
Отредактировано jon34 (Фев. 22, 2019 21:03:13)
Офлайн
def error_logger(txt): logger.error(txt, extra={'service': 'my_service'})
Офлайн
Rodegast
С таким подходом нужно будет перелопачивать весь код и вставлять использование новой функции. Такой вариант не подходит по причинам описаным в первом сообщении.
Офлайн
jon34ну народ, первая же ссылка в гугле
С таким подходом нужно будет перелопачивать весь код и вставлять использование новой функции. Такой вариант не подходит по причинам описаным в первом сообщении.
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 >>>
[code python][/code]
Отредактировано PEHDOM (Фев. 23, 2019 12:41:50)
Офлайн
PEHDOM
Видел ее, а как LoggerAdapter глобально просетить? Чтобы потом любой логгер имел эти настройки.
Офлайн
jon34не совсем понятно что значит “глобально”? можете пояснить на примере?
Видел ее, а как LoggerAdapter глобально просетить? Чтобы потом любой логгер имел эти настройки.
[code python][/code]
Офлайн
> С таким подходом нужно будет перелопачивать весь код и вставлять использование новой функции.
Не нужно ничего перелопачивать. Создаёшь модуль с логгером, а потом импортируешь его с нужным именем, и всё.
from my_logger import error_logger as logger
Офлайн
PEHDOMЯ имею ввиду, что мне нужно, чтобы созданный LoggerAdapter применялся ко всем создаваемым логгерам. То есть, чтобы при вызове в другом модуле logging.getLogger() или logging.getLogger('some-logger-name') всегда возвращался логгер, который будет “знать” о имени сервиса. То есть мне нужно, чтобы все новые логгеры знали имя сервиса.
не совсем понятно что значит “глобально”?
Офлайн
RodegastТогда получится, что библиотеки, которые пишут логи, будут это делать в неправильном формате.
Не нужно ничего перелопачивать. Создаёшь модуль с логгером, а потом импортируешь его с нужным именем, и всё.
Офлайн
jon34Я бы не рекомендовал все же править модули, мало ли чего там можно поломать. Вариант предложеный Rodegast вполне себе кошерен, более детально расписано тут https://stackoverflow.com/questions/7621897/python-logging-module-globally
Я имею ввиду, что мне нужно, чтобы созданный LoggerAdapter применялся ко всем создаваемым логгерам. То есть, чтобы при вызове в другом модуле logging.getLogger() или logging.getLogger('some-logger-name') всегда возвращался логгер, который будет “знать” о имени сервиса. То есть мне нужно, чтобы все новые логгеры знали имя сервиса.
[code python][/code]
Офлайн