2017-06-20 3 views
2

J'utilise le dictConfig suivant pour un enregistreur. Cependant, je suis incapable de modifier le niveau de journalisation lors de l'exécution.La journalisation Python remplace le niveau dictConfig

#contents de log_config.json

{ 
    "version": 1, 
    "disable_existing_loggers": false, 
    "formatters": { 
     "simple": { 
      "format": "%(asctime)s - %(name)-12s - %(levelname)-8s - %(message)s", 
      "datefmt": "%Y-%m-%d %H:%M:%S" 
     }, 
     "detailed": { 
      "format": "%(asctime)s %(name)-12s %(module)-17s line:%(lineno)-4d %(levelname)-8s %(message)s", 
      "datefmt": "%Y-%m-%d %H:%M:%S" 
     } 
    }, 

    "handlers": { 
     "console": { 
      "class": "logging.StreamHandler", 
      "level": "INFO", 
      "formatter": "simple", 
      "stream": "ext://sys.stdout" 
     }, 

     "info_file_handler": { 
      "class": "logging.handlers.TimedRotatingFileHandler", 
      "level": "INFO", 
      "formatter": "detailed", 
      "filename": "info.log", 
      "when": "midnight", 
      "backupCount": 7, 
      "encoding": "utf8" 
     }, 

     "error_file_handler": { 
      "class": "logging.handlers.TimedRotatingFileHandler", 
      "level": "ERROR", 
      "formatter": "detailed", 
      "filename": "errors.log", 
      "when": "midnight", 
      "backupCount": 7, 
      "encoding": "utf8" 
     } 
    }, 

    "loggers": { 
     "": { 
      "level": "ERROR", 
      "handlers": ["console"], 
      "propagate": "no" 
     } 
    }, 

    "root": { 
     "level": "NOTSET", 
     "handlers": ["console", "info_file_handler", "error_file_handler"] 
    } 
} 

je puis obtenir l'enregistreur et réglez le niveau en utilisant:

with open('/path/to/log_config.json', 'r') as fd: 
    cfg = json.load(fd) 

logging.config.dictConfig(cfg) 
logger = logging.getLogger(__name__) 
logger.setLevel(10) 

Mais, parce que l'enregistreur a été créée en utilisant l'dictConfig Je ne suis pas capable de passer outre les niveaux. Je voudrais construire un outil d'interface utilisateur qui a un menu d'options pour ajuster les niveaux de journalisation à l'exécution sans avoir à casser le code ouvert ou le fichier json pour faire des ajustements. Je suis capable d'ajuster le niveau plus haut, mais pour une raison quelconque il ne laissera pas le niveau descendre plus bas ...

Ce que je voudrais faire est de mettre les info_file et les gestionnaires de console à INFO (20) dans la config, puis avez la possibilité de les changer en DEBUG (10) lors de l'exécution. Des idées?

Répondre

0

J'ai eu un problème similaire, et juste compris.

Dans mon cas, je ne voulais changer le niveau du gestionnaire « console », mais vous pouvez facilement étendre à tous les gestionnaires et l'essayer:

logger = logging.getLogger(__name__) 
for handler in logger.handlers: 
    if handler.get_name() == 'console': 
     handler.setLevel(logging.DEBUG) 

(note, je copiais votre __name__, mais pour moi j'utilise une chaîne pour nommer l'enregistreur - juste au cas où ça compte)