FileConfig()関数を使用してロガー用に構成されたハンドラーを削除/検査/変更するにはどうすればよいですか?
削除するにはLogger.removeHandler(hdlr)メソッドがありますが、ファイルから構成されている場合、どうすればハンドラーを取得できますか?
logger.handlers
には、ロガーのすべてのハンドラーのリストが含まれます。
別のアプローチは、JSONまたはYAML構成ファイルを使用して辞書にロードし、それをlogger.configに渡す前に表示/操作できるようにすることです。
import yaml
import logging.config
with open (LOG_CONFIG, 'rt') as f:
config=yaml.safe_load(f)
config['handlers']['error_file_handler']['filename']='foo'
logging.config.dictConfig(config)
このコードは、すべてのロガーと各ロガーのハンドラーを出力します
for k,v in logging.Logger.manager.loggerDict.items() :
print('+ [%s] {%s} ' % (str.ljust( k, 20) , str(v.__class__)[8:-2]) )
if not isinstance(v, logging.PlaceHolder):
for h in v.handlers:
print(' +++',str(h.__class__)[8:-2] )
これにより、システム内のロガーとハンドラーの状態とレベルが出力されます。
これは、ロギングの問題をデバッグするのに役立ちます
output:
+ [root ] {logging.RootLogger} {DEBUG}
-------------------------
-name=root
-handlers=[<logging.FileHandler object at 0x7fc599585390>, <logging.StreamHandler object at 0x7fc599585550>]
-filters=[]
-propagate=True
-level=10
-disabled=False
-parent=None
+++logging.FileHandler {NOTSET}
-stream=<_io.TextIOWrapper name='/dev/logs/myapp.log' mode='w' encoding='UTF-8'>
-mode=w
-filters=[]
-encoding=None
-baseFilename=/home/dev/logs/myapp.log
-level=0
-lock=<unlocked _thread.RLock object owner=0 count=0 at 0x7fc5a85a4240>
-delay=False
-_name=None
-formatter=<logging.Formatter object at 0x7fc599585358>
+++logging.StreamHandler {DEBUG}
-lock=<unlocked _thread.RLock object owner=0 count=0 at 0x7fc5a85a4210>
-filters=[]
-stream=<ipykernel.iostream.OutStream object at 0x7fc5aa6abb00>
-level=10
-_name=None
-formatter=<logging.Formatter object at 0x7fc5995853c8>
+ [PathFinder ] {logging.Logger} {NOTSET}
-------------------------
-name=PathFinder
-handlers=[]
-filters=[]
-manager=<logging.Manager object at 0x7fc5b09757f0>
-propagate=True
-level=0
-disabled=False
-parent=<logging.RootLogger object at 0x7fc5b09757b8>