1. ホーム
  2. python

[解決済み] Pythonのロギングが何も出力されない

2022-04-25 20:09:17

質問

私が書いている Python スクリプトでは、logging モジュールを使用してイベントを記録しようとしています。私は私のロガーを設定するために、次のコードを持っています。

ERROR_FORMAT = "%(levelname)s at %(asctime)s in %(funcName)s in %(filename) at line %(lineno)d: %(message)s"
DEBUG_FORMAT = "%(lineno)d in %(filename)s at %(asctime)s: %(message)s"
LOG_CONFIG = {'version':1,
              'formatters':{'error':{'format':ERROR_FORMAT},
                            'debug':{'format':DEBUG_FORMAT}},
              'handlers':{'console':{'class':'logging.StreamHandler',
                                     'formatter':'debug',
                                     'level':logging.DEBUG},
                          'file':{'class':'logging.FileHandler',
                                  'filename':'/usr/local/logs/DatabaseUpdate.log',
                                  'formatter':'error',
                                  'level':logging.ERROR}},
              'root':{'handlers':('console', 'file')}}
logging.config.dictConfig(LOG_CONFIG)

を実行しようとすると logging.debug("Some string") にもかかわらず、コンソールに何も出力されません。 ドキュメントにあるこのページ には、次のように書かれています。 logging.debug は、ルートロガーにメッセージを出力させる必要があります。なぜ私のプログラムは何も出力しないのでしょうか、そしてどうすればそれを修正できるのでしょうか?

解決方法は?

デフォルトのロギングレベルは警告です。 レベルを変更していないため、root loggerのレベルは警告のままです。 つまり、デバッグログを含め、警告より低いレベルのログはすべて無視されます。

これについては チュートリアル :

import logging
logging.warning('Watch out!') # will print a message to the console
logging.info('I told you so') # will not print anything

レベルがinfoより高いので、'info'行は何も表示されません。

レベルを変更するには、root loggerで設定すればよい。

'root':{'handlers':('console', 'file'), 'level':'DEBUG'}

つまり、level=DEBUGでハンドラを定義するだけでは不十分で、実際のロギングレベルもDEBUGでなければ何も出力されないのです。