@Venda_98

Как добавлять произвольные данные в extra в logging python?

Хочу реализовать такой или схожий функционал с возможностью добавления произвольного (любого) числа параметров к аргументу extra в logging.debug, logging.info() и т.п.

Например:
logging.config.fileConfig("../logging.ini", disable_existing_logger=False)
logger = logging.getLogger(__name__)
logger.info("New log data", extra={"param1" : value1, "param2" : value2, … })

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

Корректировка Formatter’а тоже не подходит, так как появляется необходимость всегда вносить данные для заданных параметров, даже если они не нужны.
  • Вопрос задан
  • 260 просмотров
Решения вопроса 2
Vindicar
@Vindicar
RTFM!
Чем не устраивает вариант с непосредственной подстановкой данных в строку?
logger.info("New log data: param1 = %s, param2 = %s", value1, value2)

Просто если у тебя так много разных вариантов подставляемых данных, то проще это решать на уровне отдельного обращения к логгеру.
Ответ написан
@Venda_98 Автор вопроса
Решил проблем через подключение класса JsonFormatter из модуля jsonformatter.
Такой вариант позволяет любое число произвольных объектов добавлять:

import logging
from jsonformatter import JsonFormatter

log_file_path = "./logs/log_data.log"
data_format = {"levelname": "levelname",
               "filename": "filename",
               "module": "module",
               "funcname": "funcName",
               "asctime": "asctime",
               "message": "message"}

formatter = JsonFormatter(data_format, datefmt="%Y-%m-%d %H:%M:%S", ensure_ascii=False, 
                          mix_extra=True, mix_extra_position='tail')
json_handler = logging.FileHandler(filename=log_file_path)
json_handler.setFormatter(formatter)

logger = logging.getLogger(__name__)
logger.addHandler(json_handler)
logger.setLevel(logging.INFO)

logger.info('New message', extra={"duration" : 1000, 
                                  "value1" : 56, 
                                  "value2" : 189, 
                                  "code" : 11})


Итого, на выходе получаем каждую строчку логов в таком формате:
{'levelname': 'INFO',
 'filename': '2712754776.py',
 'module': '2712754776',
 'funcname': '<cell line: 1>',
 'asctime': '2022-11-08 17:25:26',
 'message': 'New message',
 'duration': 1000,
 'value1': 56,
 'value2': 189,
 'code': 11}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы