86 votes

journalisation supprimer / inspecter / modifier les gestionnaires configurés par fileConfig ()

Comment puis-je supprimer / inspecter / modifier les gestionnaires configurés pour mes enregistreurs à l'aide de la fonction fileConfig ()?

Pour la suppression, il existe la méthode Logger.removeHandler (hdlr), mais comment obtenir le gestionnaire en premier lieu s'il a été configuré à partir d'un fichier?

95voto

leoluk Points 6039

logger.handlers contient une liste de tous les gestionnaires d'un enregistreur.

33voto

Mickey Perlstein Points 642

Ce code imprimera tous les enregistreurs et pour chaque enregistreur ses gestionnaires

 for k,v in  logging.Logger.manager.loggerDict.items()  :
        print('+ [%s] {%s} ' % (str.ljust( k, 20)  , str(v.__class__)[8:-2]) ) 
        if not isinstance(v, logging.PlaceHolder):
            for h in v.handlers:
                print('     +++',str(h.__class__)[8:-2] )

Cela imprimera les enregistreurs et les gestionnaires de votre système, y compris leurs états et leurs niveaux.

Cela vous aidera à déboguer vos problèmes de journalisation

 output:
+ [root                ] {logging.RootLogger} {DEBUG} 
-------------------------
   -name=root
   -handlers=[<logging.FileHandler object at 0x7fc599585390>, <logging.StreamHandler object at 0x7fc599585550>]
   -filters=[]
   -propagate=True
   -level=10
   -disabled=False
   -parent=None
     +++logging.FileHandler {NOTSET}
   -stream=<_io.TextIOWrapper name='/dev/logs/myapp.log' mode='w' encoding='UTF-8'>
   -mode=w
   -filters=[]
   -encoding=None
   -baseFilename=/home/dev/logs/myapp.log
   -level=0
   -lock=<unlocked _thread.RLock object owner=0 count=0 at 0x7fc5a85a4240>
   -delay=False
   -_name=None
   -formatter=<logging.Formatter object at 0x7fc599585358>
     +++logging.StreamHandler {DEBUG}
   -lock=<unlocked _thread.RLock object owner=0 count=0 at 0x7fc5a85a4210>
   -filters=[]
   -stream=<ipykernel.iostream.OutStream object at 0x7fc5aa6abb00>
   -level=10
   -_name=None
   -formatter=<logging.Formatter object at 0x7fc5995853c8>
+ [PathFinder          ] {logging.Logger} {NOTSET} 
-------------------------
   -name=PathFinder
   -handlers=[]
   -filters=[]
   -manager=<logging.Manager object at 0x7fc5b09757f0>
   -propagate=True
   -level=0
   -disabled=False
   -parent=<logging.RootLogger object at 0x7fc5b09757b8>

13voto

Alias_Knagg Points 23

La réponse de @ Mickey-Perlstein était exactement ce que je cherchais, mais la liste semble provenir d'une version beaucoup plus complète que le code fourni. Ce code est un peu encore plus grossier, mais ce qui est crucial pour mon utilisation et ma compréhension, inclut l'enregistreur de racine

 import logging

def listloggers():
    rootlogger = logging.getLogger()
    print(rootlogger)
    for h in rootlogger.handlers:
        print('     %s' % h)

    for nm, lgr in logging.Logger.manager.loggerDict.items():
        print('+ [%-20s] %s ' % (nm, lgr))
        if not isinstance(lgr, logging.PlaceHolder):
            for h in lgr.handlers:
                print('     %s' % h)

production:

 <RootLogger root (DEBUG)>
     <TimedRotatingFileHandler /path/to/myapp.log (DEBUG)>
     <StreamHandler <stdout> (DEBUG)>
+ [concurrent.futures  ] <Logger concurrent.futures (DEBUG)> 
+ [concurrent          ] <logging.PlaceHolder object at 0x7f72f624eba8> 
+ [asyncio             ] <Logger asyncio (DEBUG)> 
+ [myapp               ] <Logger myapp (DEBUG)> 
+ [flask.app           ] <Logger flask.app (DEBUG)> 
+ [flask               ] <Logger flask (DEBUG)> 
+ [werkzeug            ] <Logger werkzeug (ERROR)> 

5voto

perlyking Points 58

Une autre approche pourrait être d'utiliser un fichier de configuration JSON ou YAML qui est chargé dans un dictionnaire que vous pouvez ensuite afficher / manipuler avant qu'il ne soit transmis à logger.config.

 import yaml
import logging.config

with open (LOG_CONFIG, 'rt') as f:
   config=yaml.safe_load(f)
   config['handlers']['error_file_handler']['filename']='foo'
logging.config.dictConfig(config)

1voto

Sicro Points 11

Suppression des gestionnaires - si cela aide quelqu'un, je voulais supprimer tous les gestionnaires pour tous les journaux que j'avais créés (j'apprenais la journalisation python) et j'ai trouvé ceci:

 def log_close():
    # get all loggers
    loggers = [logging.getLogger(name) if 'your_app_name' in name else None for name in logging.root.manager.loggerDict]
    # for each valid logger remove all handlers
    for log in loggers:
        if log != None:
            while bool(len(log.handlers)):
                for handler in log.handlers:
                    log.removeHandler(handler)
# set up log
log = logging.getLogger('your_app_name')
log.setLevel('DEBUG')
log_format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
date_format = '%Y-%m-%d %H:%M:%S'
formatter = logging.Formatter(log_format, date_format)
log_filename = 'your_app_name.log'
log_write_mode = 'w+'
file_handler = logging.FileHandler(log_filename, log_write_mode)
file_handler.setFormatter(formatter)
log.addHandler(file_handler)
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
log.addHandler(console_handler)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X