Python Ведение журнала - переопределить args / msg в «записи», чтобы избежать изменения в изменяемые данные объекта - PullRequest
0 голосов
/ 10 марта 2020

Есть ли способ реализовать фильтр ведения журнала Python с помощью класса редактирования таким образом, чтобы любой вызов регистрировал сообщение с аргументами (например, LOGGER.debug ('my message,% s,% s', data1 , data2) использует копию сообщения и аргументов вместо переданного изменяемого объекта? Наша реализация означает, что класс редактирования журнала вносит изменения в изменяемые данные, которые затем сохраняются / отправляются со строкой редактирования. Я знаю, что мы могли бы сделать это на вызов регистратора, например, LOGGER.debug («мое сообщение,% s,% s», copy.deepcopy (data1), copy.deepcopy (data2)), но надеялся, что существует возможность переопределить функцию фильтра resposnbile для "записи" в определении настройки ведения журнала?

1 Ответ

0 голосов
/ 10 марта 2020

Вы должны переопределить функцию makeRecord. К моменту применения фильтров запись уже создана.

import logging
import copy

class CopyLogger(logging.Logger):
    def makeRecord(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None, sinfo=None):
        args = copy.deepcopy(args) # <- this is the line you care about
        return super().makeRecord(name, level, fn, lno, msg, args, exc_info, func, extra, sinfo)

logging.setLoggerClass(CopyLogger)
log = logging.getLogger('mylogger')

data1 = 'hello'
data2 = 'world'
log.warning('my message, %s, %s', data1, data2)
...