Есть несколько способов.Помимо уже задокументированных (extra
аргумент для регистрации вызовов, LoggerAdapter
, Filter
), другим способом было бы указать пользовательский класс форматирования, экземпляр которого вы можете держать в курсе о файлев процессе.Например:
class FileProcessingFormatter(logging.Formatter):
def __init__(self, fmt, datefmt=None, current_file=None):
super(FileProcessingFormatter, self).__init__(fmt, datefmt)
self.orig_fmt = fmt
self.current_file = current_file
def format(self, record):
if self.current_file is None:
self._fmt = self.orig_fmt.replace('__FILE_PLACEHOLDER__', '')
else:
self._fmt = self.orig_fmt.replace('__FILE_PLACEHOLDER__',
' while processing %r' % self.current_file)
return super(FileProcessingFormatter, self).format(record)
Создание экземпляра средства форматирования ...
f = FileProcessingFormatter('%(levelname)s__FILE_PLACEHOLDER__ %(message)s')
for h in relevant_handlers:
h.setFormatter(f)
Обработка файлов ...
f.current_file = fn
process_file(fn)
f.current_file = None
Это очень упрощенно - например, недля использования в многопоточных средах, если обработка файла выполняется разными потоками одновременно.
Обновление: Хотя обработчики корневого регистратора доступны через logging.getLogger().handlers
, это деталь реализации, которая может измениться.Поскольку ваши требования не так просты, возможно, вы могли бы использовать dictConfig()
для настройки ведения журналов (доступно через проект logutils для более старых версий Python).