###
2 環境設定ファイルの書式

`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` のサブクラスは例外トレースバックを展開された形式 または圧縮された形式で表現することができます。