2017-06-20 16 views
2

ロガーには次のdictConfigを使用しています。ただし、実行時にログレベルを変更することはできません。 log_config.jsonのPythonロギングのオーバーライドdictConfigレベル

#contents

{ 
    "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"] 
    } 
} 

私は、ロガーを取得し、使用してレベルを設定します。ロガーはdictConfigを使用して作成されたため

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) 

しかし、私はないですレベルを上書きすることができます。私は、オープン・コードやjsonファイルを調整しなくても、実行時にロギング・レベルを調整するためのオプション・メニューを持つUIツールを構築したいと考えています。私はレベルを高く調整することができますが、何らかの理由でレベルを下げることはできません...

私がしたいのは、info_fileとconsoleハンドラをconfigのINFO(20)実行時にDEBUG(10)に変更するオプションがあります。何か案は?

答えて

0

私は同様の問題を抱えており、それを理解しました。

は、私の場合は、「コンソール」ハンドラのレベルを変更するようだったが、あなたは簡単にすべてのハンドラにこれを拡張し、それを試してみることができます(私はあなたの__name__をコピーし、注意

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

をしかし、私にとっては、実際の文字列を使ってロガーの名前をつけています - 問題の場合のみ)