2016-07-21 4 views
0

ロガーは、コンソールと回転ファイルの2つのハンドラでセットアップされています。私は個々のハンドラを独自のログレベルで設定しました。そのアイデアは、コンソールで重要なメッセージが利用できるということです。さらにトラブルシューティングを行う必要がある場合は、低レベルのものがファイルに保存されます。個々のハンドラのログレベルをPythonで動的に変更できますか?

私の設定ファイルは次のようになります。動的に個々のハンドラのログレベルを変更する(してからリセット)する方法は

[loggers] 
keys=root 

[handlers] 
keys=consoleHandler,rotateFileHandler 

[formatters] 
keys=simpleFormatter 

[logger_root] 
level=DEBUG 
handlers=consoleHandler,rotateFileHandler 
qualname=MyApplication 
propagate=0 

[handler_consoleHandler] 
class=StreamHandler 
level=ERROR 
formatter=simpleFormatter 
args=(sys.stdout,) 

[handler_rotateFileHandler] 
class=handlers.RotatingFileHandler 
level=INFO 
formatter=simpleFormatter 
args=('TESTLOG.log', 'a', 100000, 5, 'utf8') 

[formatter_simpleFormatter] 
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s 
datefmt= 

ありますか?私はこれをしようとしましたが、loggerは、まあ、ロガーでありハンドラではないので失敗します。また、既にDEBUGに設定されています。ハンドラは上位レベルに設定されています。私の目標は、一定の期間のために低いレベル(すなわち。logging.DEBUGにコンソールを設定し、変更が実行される前に、前のレベルを保存するか、明示的にリセットすることにより、いずれか、戻ってそれを変更することができるようにすることです

import logging 
import logging.config 

logging.config.fileConfig('logging.config', disable_existing_loggers=False) 
logger = logging.getLogger('TestLog') 

def main(): 
    logger.debug('debug message') 
    logger.info('info message') 
    logger.warn('warn message') 
    logger.error('error message') 
    logger.critical('critical message') 
    # Reset log level to debug temporarily 
    logger.setLevel(logging.DEBUG) 
    logger.debug('This message appears if level was reset to DEBUG') 

if __name__ == '__main__': 
    main() 

それ)。私はこれを行うとき、私は他のハンドラに触れたくありません。

ハンドラーのログレベルを動的に変更するにはどうすればよいですか?

+0

'logger_root'セクションでは、' qualname'フィールドは完全に無視されます。それを設定することに意味はありません。 –

答えて

2

あなたが特定のハンドラに横断する必要があるだろう:

console_handler = logging.getLogger().handlers[0] 
old_level = console_handler.level 
console_handler.setLevel(logging.DEBUG) 

指数は、(与えられたロガー上の任意の以前のハンドラは設定がロードされる研ぐクリアされている)あなたのロギング設定にhandlersから順に一致します。

+0

インデックスは常に設定ファイルの '[handler]'ブロックで定義された順序と一致しますか?私の場合、 'keys = consoleHandler、rotateFileHandler'なので、' .handlers [0] 'は常にconsoleHandlerですか? – NewGuy

+0

@NewGuy: '[handler]'ブロックではありません。順序は与えられた 'logger_ *'セクションの 'handlers ='フィールドによって設定されます。 –

関連する問題