fileConfig() が解釈できる環境設定ファイルの形式は、
ConfigParser の機能に基づいています。
ファイルには、[loggers]
、 [handlers]
、および
[formatters]
といったセクションが入っていなければならず、
各セクションではファイル中で定義されている各タイプのエンティティを
名前で指定しています。こうしたエンティティの各々について、
そのエンティティをどう設定するかを示した個別のセクションがあります。
すなわち、log01
という名前の [loggers]
セクションにある
ロガーに対しては、対応する詳細設定がセクション [logger_log01]
に収められています。同様に、 hand01
という名前の
[handlers]
セクションにあるハンドラは [handler_hand01]
と呼ばれるセクションに設定をもつことになり、[formatters]
セクションにある form01
は [formatter_form01]
というセクションで設定が指定されています。ルートロガーの
設定は [logger_root]
と呼ばれるセクションで指定
されていなければなりません。
ファイルにおけるこれらのセクションの例を以下に示します。
[loggers] keys=root,log02,log03,log04,log05,log06,log07 [handlers] keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09 [formatters] keys=form01,form02,form03,form04,form05,form06,form07,form08,form09
ルートロガーでは、レベルとハンドラのリストを指定しなければ なりません。ルートロガーのセクションの例を以下に示します。
[logger_root] level=NOTSET handlers=hand01
level
エントリは DEBUG, INFO, WARNING, ERROR, CRITICAL
のうちの一つか、NOTSET
になります。ルートロガーの場合にのみ、
NOTSET
は全てのメッセージがログ記録されることを意味します。
レベル値は logging
パッケージの名前空間のコンテキストに
おいて eval() されます。
handlers
エントリはコンマで区切られたハンドラ名からなる
リストで、[handlers]
セクションになくてはなりません。
また、これらの各ハンドラの名前に対応するセクションが設定ファイルに
存在しなければなりません。
ルートロガー以外のロガーでは、いくつか追加の情報が必要になります。 これは以下の例のように表されます。
[logger_parser] level=DEBUG handlers=hand01 propagate=1 qualname=compiler.parser
level
および handlers
エントリはルートロガーのエントリ
と同様に解釈されますが、非ルートロガーのレベルが NOTSET
に指定された場合、ログ記録システムはロガー階層のより上位のロガー
にロガーの実効レベルを問い合わせるところが違います。
propagate
エントリは、メッセージをロガー階層におけるこの
ロガーの上位のハンドラに伝播させることを示す 1 に設定されるか、
メッセージを階層の上位に伝播しない ことを示す 0 に
設定されます。
qualname
エントリはロガーのチャネル名を階層的に表した
もの、すなわちアプリケーションがこのロガーを取得する際に使う
名前になります。
ハンドラの環境設定を指定しているセクションは以下の例のようになります。
[handler_hand01] class=StreamHandler level=NOTSET formatter=form01 args=(sys.stdout,)
class
エントリはハンドラのクラス (logging
パッケージの
名前空間において eval() で決定されます) を示します。
level
はロガーの場合と同じように解釈され、NOTSET
は "全てを記録する (log everything)" と解釈されます。
formatter
エントリはこのハンドラのフォーマッタに対するキー名
を表します。空文字列の場合、デフォルトのフォーマッタ
(logging._defaultFormatter
) が使われます。名前が指定
されている場合、その名前は [formatters]
セクションになくては
ならず、対応するセクションが設定ファイル中になければなりません。
args
エントリは、logging
パッケージの名前空間の
コンテキストで eval() される際、ハンドラクラスの
コンストラクタに対する引数からなるリストになります。
典型的なエントリがどうやって作成されるかについては、対応するハンドラのコンストラクタか、以下の例を参照してください。
[handler_hand02] class=FileHandler level=DEBUG formatter=form02 args=('python.log', 'w') [handler_hand03] class=handlers.SocketHandler level=INFO formatter=form03 args=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT) [handler_hand04] class=handlers.DatagramHandler level=WARN formatter=form04 args=('localhost', handlers.DEFAULT_UDP_LOGGING_PORT) [handler_hand05] class=handlers.SysLogHandler level=ERROR formatter=form05 args=(('localhost', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER) [handler_hand06] class=handlers.NTEventLogHandler level=CRITICAL formatter=form06 args=('Python Application', '', 'Application') [handler_hand07] class=handlers.SMTPHandler level=WARN formatter=form07 args=('localhost', 'from@abc', ['user1@abc', 'user2@xyz'], 'Logger Subject') [handler_hand08] class=handlers.MemoryHandler level=NOTSET formatter=form08 target= args=(10, ERROR) [handler_hand09] class=handlers.HTTPHandler level=NOTSET formatter=form09 args=('localhost:9022', '/log', 'GET')
フォーマッタの環境設定を指定しているセクションは以下のような形式です。
[formatter_form01] format=F1 %(asctime)s %(levelname)s %(message)s datefmt= class=logging.Formatter
format
エントリは全体を書式化する文字列で、datefmt
エントリは strftime() 互換の日付/時刻書式化文字列です。
空文字列の場合、パッケージによって ISO8601 形式の 日付/時刻に置き換えられ、
日付書式化文字列 "ISO8601 形式ではミリ秒も指定しており、上の書式化文字列の結果にカンマ
で区切って追加されます。ISO8601 形式の時刻の例は
2003-01-23 00:29:50,411
です。
class
エントリはオプションです。class
はフォーマッタのクラス名
(ドット区切りのモジュールとクラス名として)を示します。このオプションは
Formatter のサブクラスをインスタンス化するのに有用です。
Formatter のサブクラスは例外トレースバックを展開された形式
または圧縮された形式で表現することができます。