Existen varias formas. Además del argumento already documented ones (extra
para registrar llamadas, LoggerAdapter
, Filter
), otra forma sería especificar una clase de formato personalizada, cuya instancia puede mantener informada sobre el archivo que se está procesando. Por ejemplo:
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)
una instancia del formateador ...
f = FileProcessingFormatter('%(levelname)s__FILE_PLACEHOLDER__ %(message)s')
for h in relevant_handlers:
h.setFormatter(f)
Procesar archivos ...
f.current_file = fn
process_file(fn)
f.current_file = None
Esto es muy simple - por ejemplo, no para su uso en entornos roscados si el procesamiento de archivos se realiza por diferentes hilos al mismo tiempo.
Actualización: Aunque los manipuladores del registrador de la raíz son accesibles a través de logging.getLogger().handlers
, este es un detalle de implementación que podría cambiar. Como su requisito no es tan básico, quizás pueda usar dictConfig()
para configurar su registro (disponible a través del proyecto logutils para versiones anteriores de Python).
He actualizado mi respuesta. –