29210


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

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

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

    * 何も出力されない。
  3. dictConfig()でログ設定を行い、設定後に取得したロガーを使用した場合

    * 設定が反映されてログが正常に出力される。

2.でなぜ何も出力されないのでしょうか？  
ログ設定を行っていない場合でも、デフォルトではWARNとERRORは出力されるはずなのですが。

Pythonバージョンは3.5と2.7で確認しています。

以下、サンプルコードと実行結果です。

test_logging_sub.py

[code]

    from logging import getLogger
    
    logger = getLogger(__name__)
    
    
    def hoge():
        logger.debug("debug")
        logger.info("info")
        logger.warn("warn")
        logger.error("error")
    
[/code]

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

[code]

    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()
    
[/code]

実行結果(設定が反映されている)

[code]

    $ python test_logging_main1.py
    [DEBUG] debug
    [INFO] info
    [WARNING] warn
    [ERROR] error
    
[/code]

test_logging_main2.py (dictConfig()でログ設定を行い、設定前に取得したロガーを使用した場合)

[code]

    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()
    
[/code]

実行結果(何も出ない)

[code]

    $ python test_logging_main2.py
    $ 
    
[/code]

test_logging_main3.py (dictConfig()でログ設定を行い、設定後に取得したロガーを使用した場合)

[code]

    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()
    
[/code]

実行結果(設定が反映されている)

[code]

    $ python test_logging_main3.py
    [DEBUG] debug
    [INFO] info
    [WARNING] warn
    [ERROR] error
    
[/code]


CC BY-SA 3.0
2016-09-28T03:33:50.283
29200
2016-09-29T00:58:00.763
2016-09-29T00:58:00.763
18862
18862
question
python
logging.config.dictConfig()を使った時にログが出力されない


`logging.config.dictConfig` を用いる際に、"disable_existing_loggers"
キーを指定しないと、既存のロガーは無効になります。[ドキュメントにこう書かれています](https://docs.python.org/2/library/logging.config.html#dictionary-
schema-details)

> _disable_existing_loggers_ \- whether any existing loggers are to be
> disabled. ... If absent, this parameter defaults to `True`...

それを `False` に指定すると、ロガーを保留し、ログを出てきます。つまり

[code]

    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"],
        },
        "disable_existing_loggers": False, # こうします
    })
    
    hoge()
    
[/code]


CC BY-SA 3.0
2016-09-28T07:44:05.613
29210
2016-09-28T07:44:05.613
18621
29200
answer