Estou tentando escrever uma logging.Logger
subclasse personalizada que está funcionando, mas tenho problemas ao tentar usar uma logging.Formatter
que inclui o valor interpolado %(filename)
no formato personalizado. Ela imprime o nome do arquivo onde está minha subclasse personalizada, em vez do nome do arquivo do código que chamou a função de registro.
Encontrei vários tutoriais para subclassificar Logger, mas nenhum deles aborda os efeitos que isso tem na interpolação de nome de arquivo. Existe uma solução direta para isso sem ter que sobrescrever grandes seções de logging.Logger
?
Código de exemplo definindo meu registrador personalizado:
#-------------------------------------
# custom_logger.py
#-------------------------------------
import logging
import io
class CustomLogger(logging.Logger):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setLevel(logging.DEBUG)
# create the record format
formatter = logging.Formatter(fmt = "%(filename)s - %(message)s")
# create the handler
self.stream = io.StringIO()
handler = logging.StreamHandler(self.stream)
handler.setFormatter(formatter)
self.addHandler(handler)
def debug(self, msg, *args, **kwargs):
super().debug(msg, *args, **kwargs)
# do some other stuff
...
#-------------------------------------
# test.py
#-------------------------------------
from custom_logger import CustomLogger
import logging
logging.setLoggerClass(CustomLogger)
myLog = logging.getLogger("myLog")
myLog.debug("hello world")
print(myLog.stream.getvalue())
Saída esperada:
>>> test.py - hello world
Produção real:
>>> custom_logger.py - hello world