J'utilise le logging
avec le module filename
pour capturer la sortie du journal de mon code. Cela fonctionne bien, car je sais maintenant toujours à partir de quel fichier le message a été envoyé. Cependant, j'ai un décorateur de journalisation indenté pour lequel j'aimerais enregistrer le nom de fichier à l'endroit où il a été envoyé. est utilisé et non le module où le décorateur est défini . Est-ce possible ?
Voici un bref exemple de ce qu'il fait actuellement :
test.py
import logging
from log import logger
from log import indented
@indented('Here I start my method...', 'And here it ends')
def my_func():
logger.info('Look, a message!')
if __name__ == '__main__':
logging.basicConfig(
filename='LOG',
level=logging.DEBUG,
format='%(asctime)s.%(msecs)03d [ %(levelname)-8s] %(filename)s: %(message)s',
datefmt="%Y-%m-%d %H:%M:%S")
my_func()
Sortie du journal
2018-07-27 13:27:15.541 [ INFO ] log.py: Here I start my method...
2018-07-27 13:27:15.541 [ INFO ] test.py: ---- Look, a message!
2018-07-27 13:27:15.541 [ INFO ] log.py: And here it ends
Je voudrais maintenant que les trois messages contiennent test.py
comme suit :
Résultats souhaités
2018-07-27 13:27:15.541 [ INFO ] test.py: Here I start my method...
2018-07-27 13:27:15.541 [ INFO ] test.py: ---- Look, a message!
2018-07-27 13:27:15.541 [ INFO ] test.py: And here it ends
log.py
import logging
from contextlib import contextmanager
from functools import wraps
class IndentationAdapter(logging.LoggerAdapter):
def __init__(self, logger, extra):
super().__init__(logger, extra)
self._indent = 0
def indent(self):
self._indent += 4
def dedent(self):
self._indent -= 4
def process(self, msg, kwargs):
if self._indent > 0:
return '{i} {m}'.format(i='-'*self._indent, m=msg), kwargs
else:
return msg, kwargs
logger = IndentationAdapter(logging.getLogger(), {})
@contextmanager
def indent_logging():
logger.indent()
try:
yield
finally:
logger.dedent()
def indented(begin_message, end_message):
def indent_decorator(func):
@wraps(func)
def func_wrapper(*args, **kwargs):
logger.info(begin_message)
with indent_logging():
output = func(*args, **kwargs)
logger.info(end_message)
return output
return func_wrapper
return indent_decorator