いくつかの方法があります。 、Filter
など、already documented ones(ログ呼び出しの引数はextra
)以外に、独自の書式設定クラスを指定する方法もあります。このカスタム書式設定クラスでは、処理中のファイルについての情報を保持できます。たとえば、次のように
class FileProcessingFormatter(logging.Formatter):
def __init__(self, fmt, datefmt=None, current_file=None):
super(FileProcessingFormatter, self).__init__(fmt, datefmt)
self.orig_fmt = fmt
self.current_file = current_file
def format(self, record):
if self.current_file is None:
self._fmt = self.orig_fmt.replace('__FILE_PLACEHOLDER__', '')
else:
self._fmt = self.orig_fmt.replace('__FILE_PLACEHOLDER__',
' while processing %r' % self.current_file)
return super(FileProcessingFormatter, self).format(record)
インスタンス化フォーマッタ...
f = FileProcessingFormatter('%(levelname)s__FILE_PLACEHOLDER__ %(message)s')
for h in relevant_handlers:
h.setFormatter(f)
プロセスファイル...
f.current_file = fn
process_file(fn)
f.current_file = None
これは非常に単純である - 例えば、ないスレッド環境での使用のためにならばファイル処理は異なるスレッドによって同時に行われます。
アップデート:ルートロガーのハンドラはlogging.getLogger().handlers
でアクセスできますが、これは変更可能な実装の詳細です。要件が基本的ではないため、dictConfig()
を使用してログを構成できます(logutilsプロジェクトの古いバージョンのPythonで利用可能)。
私は自分の答えを更新しました。 –