Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 22, 2019 21:02:16

jon34
Зарегистрирован: 2016-02-14
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

logging, добавление не стандартного поля

Есть задача настроить формат логирования, загвоздка заключается в том, что нужно добавить в вывод не стандартное поле.

Сейчас нашел вот такой пример в сети

 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).

Подскажите пожалуйста как правильно это сделать.

Отредактировано jon34 (Фев. 22, 2019 21:03:13)

Офлайн

#2 Фев. 22, 2019 22:08:17

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2821
Репутация: +  185  -
Профиль   Отправить e-mail  

logging, добавление не стандартного поля

 def error_logger(txt):
    logger.error(txt, extra={'service': 'my_service'})



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Фев. 23, 2019 10:17:09

jon34
Зарегистрирован: 2016-02-14
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

logging, добавление не стандартного поля

Rodegast
С таким подходом нужно будет перелопачивать весь код и вставлять использование новой функции. Такой вариант не подходит по причинам описаным в первом сообщении.

Офлайн

#4 Фев. 23, 2019 12:38:02

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

logging, добавление не стандартного поля

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
>>>



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Фев. 23, 2019 12:41:50)

Офлайн

#5 Фев. 23, 2019 16:42:46

jon34
Зарегистрирован: 2016-02-14
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

logging, добавление не стандартного поля

PEHDOM
Видел ее, а как LoggerAdapter глобально просетить? Чтобы потом любой логгер имел эти настройки.

Офлайн

#6 Фев. 23, 2019 17:24:51

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

logging, добавление не стандартного поля

jon34
Видел ее, а как LoggerAdapter глобально просетить? Чтобы потом любой логгер имел эти настройки.
не совсем понятно что значит “глобально”? можете пояснить на примере?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#7 Фев. 23, 2019 22:58:49

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2821
Репутация: +  185  -
Профиль   Отправить e-mail  

logging, добавление не стандартного поля

> С таким подходом нужно будет перелопачивать весь код и вставлять использование новой функции.

Не нужно ничего перелопачивать. Создаёшь модуль с логгером, а потом импортируешь его с нужным именем, и всё.

 from my_logger import error_logger as logger



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#8 Фев. 24, 2019 10:55:07

jon34
Зарегистрирован: 2016-02-14
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

logging, добавление не стандартного поля

PEHDOM
не совсем понятно что значит “глобально”?
Я имею ввиду, что мне нужно, чтобы созданный LoggerAdapter применялся ко всем создаваемым логгерам. То есть, чтобы при вызове в другом модуле logging.getLogger() или logging.getLogger('some-logger-name') всегда возвращался логгер, который будет “знать” о имени сервиса. То есть мне нужно, чтобы все новые логгеры знали имя сервиса.

Офлайн

#9 Фев. 24, 2019 18:20:56

jon34
Зарегистрирован: 2016-02-14
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

logging, добавление не стандартного поля

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

Офлайн

#10 Фев. 25, 2019 10:01:36

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

logging, добавление не стандартного поля

jon34
Я имею ввиду, что мне нужно, чтобы созданный LoggerAdapter применялся ко всем создаваемым логгерам. То есть, чтобы при вызове в другом модуле logging.getLogger() или logging.getLogger('some-logger-name') всегда возвращался логгер, который будет “знать” о имени сервиса. То есть мне нужно, чтобы все новые логгеры знали имя сервиса.
Я бы не рекомендовал все же править модули, мало ли чего там можно поломать. Вариант предложеный Rodegast вполне себе кошерен, более детально расписано тут https://stackoverflow.com/questions/7621897/python-logging-module-globally
Выносите настройку логера в отдельный модуль и подключайте его. От вас потребуеться минимум вмешательства, при этом вы гарантировано ничего не поломаете.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version