1. ホーム
  2. python

[解決済み] python logging formatter を適切にフォーマットする方法は?

2022-03-03 14:20:48

質問

Pythonのロギングフォーマッタが出力する文字列をフォーマットしようと思っています。私は問題を示すために最小限の例を書きました。

import logging
from pathlib import Path

# create auxiliary variables
loggerName = Path(__file__).stem

# create logging formatter
logFormatter = logging.Formatter(fmt=' %(name)s :: %(levelname)s :: %(message)s')

# create logger
logger = logging.getLogger(loggerName)
logger.setLevel(logging.DEBUG)

# create console handler
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.WARNING)
consoleHandler.setFormatter(logFormatter)

# Add console handler to logger
logger.addHandler(consoleHandler)

# Test
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')

このスクリプトは、適切な書式設定をしていない状態で出力されます。

logger :: WARNING :: warn message
logger :: ERROR :: error message
logger :: CRITICAL :: critical message

ログの左側が整列するように書式を変更したいのですが、どうすればいいですか?

logger :: WARNING  :: warn message
logger :: ERROR    :: error message
logger :: CRITICAL :: critical message

解決方法は?

フォーマット文字列は、Pythonの正規の % -という書式もあります。 printf -スタイルの書式設定です。これについては、以下のドキュメントで詳しく説明されています。 https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting 求めるのは、フィールド幅の最小値と - フラグを使用します。

'-' 変換後の値は調整されたままです

ということで

logFormatter = logging.Formatter(fmt=' %(name)s :: %(levelname)-8s :: %(message)s')

を実行すると、次のような出力が得られます。

 test :: WARNING  :: warn message
 test :: ERROR    :: error message
 test :: CRITICAL :: critical message