Python標準モジュールのloggingを使用してログを出力する時に、loggingの設定方法とgetLogger()を呼び出すタイミングによって、ログ出力に違いがありました。

  1. ルートロガーでログ設定を行い、設定前に取得したロガーを使用した場合

    • 設定が反映されてログが正常に出力される。
  2. dictConfig()でログ設定を行い、設定前に取得したロガーを使用した場合

    • 何も出力されない。
  3. 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