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=
format エントリは全体を書式化する文字列で、datefmt
エントリは strftime() 互換の日付/時刻書式化文字列です。
空文字列の場合、パッケージによって ISO8601 形式の 日付/時刻に置き換えられ、
日付書式化文字列 "ISO8601 形式ではミリ秒も指定しており、上の書式化文字列の結果にカンマ
で区切って追加されます。ISO8601 形式の時刻の例は
2003-01-23 00:29:50,411 です。