2番目の例でも期待通りに動作しますが、
main側でのsubの扱いはどのようにされてますか。
getLogger が dictConfig の前か後か、この場合
sub を import する位置によって動作が変わってくるはずです。
ロギングの環境設定より disable_existing_loggers
警告 fileConfig() 関数はデフォルト引数 disable_existing_loggers を取り、後方互換性のためにデフォルト値は True になっています。 これはあなたの望むものかもしれませんし、そうでないかもしれません。というのは、設定で明示的に指定したクラス (もしくはその親クラス) を除いて、 fileConfig() が呼び出される前に存在した非ルートロガーを無効化してしまうからです。 より詳細なことはリファレンスを参照し、望むならこの引数に False を指定してください。
dictConfig() に渡した辞書で、キー disable_existing_loggers にブール値を指定することができ、辞書で指定しなかった場合はデフォルトで True と解釈されます。こうすると上で説明したロガー無効化が動作しますが、これはあなたが望んだものでないかもしれません - その場合は、明示的にキーに False を指定してください。
解決策:
'disable_existing_loggers': False
を設定する
disable_existing_loggers の挙動について、動作確認用のサンプルコードを追記します。
コメントアウト部分を編集して試してみてください。
(※ モジュールキャッシュの影響がないことを明示する為、
import sub が dictConfig 後の時は、ファイル先頭のimportはコメントアウトで)
| (1) disable_existing_loggers | (2) import sub の位置 |
---|
case 1 | True(省略時) | ファイル先頭 |
case 2 | True(省略時) | dictConfig 後 |
case 3 | False | ファイル先頭 |
case 4 | False | dictConfig 後 |
python
1# main.py
2
3import logging.config
4import sub
5
6if __name__ == "__main__":
7 logging.config.dictConfig({
8 'version': 1,
9 'formatters': {
10 'brief': {
11 'format': '[%(asctime)s] %(levelname)s in %(module)s %(funcName)s: %(message)s',
12 }
13 },
14 'handlers': {
15 'console': {
16 'class': 'logging.StreamHandler',
17 'formatter': 'brief',
18 'stream': 'ext://sys.stdout',
19 }
20 },
21 'root': {
22 'level': 'DEBUG',
23 'handlers': ['console']
24 },
25 # (1)
26 # 'disable_existing_loggers': False,
27 })
28 # (2)
29 # import sub
30
31 logger = logging.getLogger(__name__)
32 logger.debug("TEST")
33
34 sub.funcA()
35 sub.funcB()
python
1# sub.py
2
3import logging
4
5logger = logging.getLogger(__name__)
6
7def funcA():
8 logger.debug("TEST")
9
10def funcB():
11 logger = logging.getLogger(__name__)
12 logger.debug("TEST")
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/29 13:08
2020/04/29 13:18
2020/04/29 14:07 編集
2020/04/30 01:58
2020/04/30 02:37