logging.config.dictConfig()を使った時にログが出力されない
Python標準モジュールのloggingを使用してログを出力する時に、loggingの設定方法とgetLogger()を呼び出すタイミングによって、ログ出力に違いがありました。
ルートロガーでログ設定を行い、設定前に取得したロガーを使用した場合
- 設定が反映されてログが正常に出力される。
dictConfig()でログ設定を行い、設定前に取得したロガーを使用した場合
- 何も出力されない。
dictConfig()でログ設定を行い、設定後に取得したロガーを使用した場合
- 設定が反映されてログが正常に出力される。
2.でなぜ何も出力されないのでしょうか?
ログ設定を行っていない場合でも、デフォルトではWARNとERRORは出力されるはずなのですが。
Pythonバージョンは3.5と2.7で確認しています。
以下、サンプルコードと実行結果です。
test_logging_sub.py
from logging import getLogger
logger = getLogger(__name__)
def hoge():
logger.debug("debug")
logger.info("info")
logger.warn("warn")
logger.error("error")
test_logging_main1.py (ルートロガーでログ設定を行い、設定前に取得したロガーを使用した場合)
from logging import (getLogger, DEBUG, StreamHandler, Formatter)
if __name__ == "__main__":
from test_logging_sub import hoge
formatter = Formatter("[%(levelname)s] %(message)s")
handler = StreamHandler()
handler.setLevel(DEBUG)
handler.setFormatter(formatter)
logger = getLogger()
logger.addHandler(handler)
logger.setLevel(DEBUG)
hoge()
実行結果(設定が反映されている)
$ python test_logging_main1.py
[DEBUG] debug
[INFO] info
[WARNING] warn
[ERROR] error
test_logging_main2.py (dictConfig()でログ設定を行い、設定前に取得したロガーを使用した場合)
import logging.config
if __name__ == "__main__":
from test_logging_sub import hoge
logging.config.dictConfig({
"version": 1,
"formatters": {
"simple": {
"format": "[%(levelname)s] %(message)s"
},
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": "DEBUG",
"formatter": "simple",
}
},
"root": {
"level": "DEBUG",
"handlers": ["console"]
}
})
hoge()
実行結果(何も出ない)
$ python test_logging_main2.py
$
test_logging_main3.py (dictConfig()でログ設定を行い、設定後に取得したロガーを使用した場合)
import logging.config
if __name__ == "__main__":
logging.config.dictConfig({
"version": 1,
"formatters": {
"simple": {
"format": "[%(levelname)s] %(message)s"
},
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": "DEBUG",
"formatter": "simple",
}
},
"root": {
"level": "DEBUG",
"handlers": ["console"]
}
})
from test_logging_sub import hoge
hoge()
実行結果(設定が反映されている)
$ python test_logging_main3.py
[DEBUG] debug
[INFO] info
[WARNING] warn
[ERROR] error