15.9. logging.handlers
— ロギングハンドラ¶
Source code: Lib/logging/handlers.py
このパッケージでは、以下の便利なハンドラが提供されています。なお、これらのハンドラのうち、3 つ (StreamHandler
, FileHandler
および NullHandler
) は、実際には logging
モジュール自身で定義されていますが、他のハンドラと一緒にここでドキュメント化します。
15.9.1. StreamHandler¶
logging
コアパッケージに含まれる StreamHandler
クラスは、ログ出力を sys.stdout, sys.stderr あるいは何らかのファイル風 (file-like) オブジェクト (あるいは、より正確に言えば write()
および flush()
メソッドをサポートする何らかのオブジェクト) といったストリームに送信します。
-
class
logging.
StreamHandler
(stream=None)¶ StreamHandler
クラスの新たなインスタンスを返します。 stream が指定された場合、インスタンスはログ出力先として指定されたストリームを使います; そうでない場合、 sys.stderr が使われます。-
emit
(record)¶ フォーマッタが指定されていれば、フォーマッタを使ってレコードを書式化します。次に、レコードが改行とともにストリームに書き込まれます。例外情報が存在する場合、
traceback.print_exception()
を使って書式化され、ストリームの末尾につけられます。
-
15.9.2. FileHandler¶
logging
コアパッケージに含まれる FileHandler
クラスは、ログ出力をディスク上のファイルに送信します。このクラスは出力機能を StreamHandler
から継承しています。
-
class
logging.
FileHandler
(filename, mode='a', encoding=None, delay=False)¶ FileHandler
クラスの新たなインスタンスを返します。指定されたファイルが開かれ、ログ記録のためのストリームとして使われます。 mode が指定されなかった場合、'a'
が使われます。 encoding がNone
でない場合、その値はファイルを開くときのエンコーディングとして使われます。 delay が真ならば、ファイルを開くのは最初のemit()
呼び出しまで遅らせられます。デフォルトでは、ファイルは無制限に大きくなりつづけます。バージョン 2.6 で変更: delay が追加されました。
-
close
()¶ ファイルを閉じます。
-
emit
(record)¶ record をファイルに出力します。
-
15.9.3. NullHandler¶
バージョン 2.7 で追加.
logging
コアパッケージに含まれる NullHandler
クラスは、いかなる書式化も出力も行いません。これは本質的には、ライブラリ開発者に使われる 'no-op' ハンドラです。
-
class
logging.
NullHandler
¶ NullHandler
クラスの新しいインスタンスを返します。-
emit
(record)¶ このメソッドは何もしません。
-
handle
(record)¶ このメソッドは何もしません。
-
createLock
()¶ アクセスが特殊化される必要がある I/O が下にないので、このメソッドはロックに対して
None
を返します。
-
NullHandler
の使い方の詳しい情報は、 ライブラリのためのロギングの設定 を参照してください。
15.9.4. WatchedFileHandler¶
バージョン 2.6 で追加.
logging.handlers
モジュールに含まれる WatchedFileHandler
クラスは、ログ記録先のファイルを監視する FileHandler
の一種です。ファイルが変更された場合、ファイルを閉じてからファイル名を使って開き直します。
ファイルはログファイルをローテーションさせる newsyslog や logrotate のようなプログラムを使うことで変更されることがあります。このハンドラは、 Unix/Linux で使われることを意図していますが、ファイルが最後にログを出力してから変わったかどうかを監視します。 (ファイルはデバイスや inode が変わることで変わったと判断します。) ファイルが変わったら古いファイルのストリームは閉じて、現在のファイルを新しいストリームを取得するために開きます。
このハンドラを Windows で使うことは適切ではありません。というのも Windows では開いているログファイルを移動したり削除したりできないからです - logging はファイルを排他的ロックを掛けて開きます - そのためこうしたハンドラは必要ないのです。さらに、 Windows では ST_INO がサポートされていません; stat()
はこの値として常に 0 を返します。
-
class
logging.handlers.
WatchedFileHandler
(filename[, mode[, encoding[, delay]]])¶ WatchedFileHandler
クラスの新たなインスタンスを返します。指定されたファイルが開かれ、ログ記録のためのストリームとして使われます。 mode が指定されなかった場合、'a'
が使われます。 encoding がNone
でない場合、その値はファイルを開くときのエンコーディングとして使われます。 delay が真ならば、ファイルを開くのは最初のemit()
呼び出しまで遅らせられます。デフォルトでは、ファイルは無制限に大きくなりつづけます。-
emit
(record)¶ レコードをファイルに出力しますが、その前にファイルが変更されていないかチェックします。もし変更されていれば、レコードをファイルに出力する前に、既存のストリームはフラッシュして閉じられ、ファイルが再度開かれます。
-
15.9.5. RotatingFileHandler¶
logging.handlers
モジュールに含まれる RotatingFileHandler
クラスは、ディスク上のログファイルに対するローテーション処理をサポートします。
-
class
logging.handlers.
RotatingFileHandler
(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)¶ RotatingFileHandler
クラスの新たなインスタンスを返します。指定されたファイルが開かれ、ログ記録のためのストリームとして使われます。 mode が指定されなかった場合、'a'
が使われます。 encoding がNone
でない場合、その値はファイルを開くときのエンコーディングとして使われます。 delay が真ならば、ファイルを開くのは最初のemit()
呼び出しまで遅らせられます。デフォルトでは、ファイルは無制限に大きくなりつづけます。maxBytes および backupCount 値を指定することで、あらかじめ決められたサイズでファイルをロールオーバ (rollover) させることができます。指定サイズを超えそうになると、ファイルは閉じられ、暗黙のうちに新たなファイルが開かれます。ロールオーバは現在のログファイルの長さが maxBytes に近くなると常に起きます。 maxBytes または backupCount がゼロなら、ロールオーバは起こりません。 backupCount が非ゼロの場合、システムは古いログファイルをファイル名に ".1", ".2" といった拡張子を追加して保存します。例えば、 backupCount が 5 で、基本のファイル名が
app.log
なら、app.log
,app.log.1
,app.log.2
… と続き、app.log.5
までを得ることになります。ログの書き込み対象になるファイルは常にapp.log
です。このファイルが満杯になると、ファイルは閉じられ、app.log.1
に名前が変更されます。app.log.1
,app.log.2
などが存在する場合、それらのファイルはそれぞれapp.log.2
,app.log.3
といった具合に名前が変更されます。バージョン 2.6 で変更: delay が追加されました。
-
doRollover
()¶ 上述のような方法でロールオーバを行います。
-
emit
(record)¶ 上述のようなロールオーバを行いながら、レコードをファイルに出力します。
-
15.9.6. TimedRotatingFileHandler¶
logging.handlers
モジュールに含まれる TimedRotatingFileHandler
クラスは、特定の時間間隔でのログローテーションをサポートしています。
-
class
logging.handlers.
TimedRotatingFileHandler
(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False)¶ TimedRotatingFileHandler
クラスの新たなインスタンスを返します。 filename に指定したファイルを開き、ログ出力先のストリームとして使います。ログファイルのローテーション時には、ファイル名に拡張子 (suffix) をつけます。ログファイルのローテーションは when および interval の積に基づいて行います。when は interval の単位を指定するために使います。使える値は下表の通りです。大小文字の区別は行いません。
値
interval の単位 'S'
秒 'M'
分 'H'
時間 'D'
日 'W0'-'W6'
曜日 (0=月曜) 'midnight'
深夜 曜日ベースのローテーションを使う場合は、月曜として 'W0' を、火曜として 'W1' を、…、日曜として 'W6' を指定します。このケースの場合は、 interval は使われません。
古いログファイルを保存する際にロギングシステムは拡張子を付けます。拡張子は日付と時間に基づいて、 strftime の
%Y-%m-%d_%H-%M-%S
形式かその前方の一部を、ロールオーバ間隔に依存した形で使います。最初に次のロールオーバー時間を計算するとき (ハンドラが生成されるとき)、次のローテーションがいつ起こるかを計算するために、既存のログファイルの最終変更時刻または現在の時間が使用されます。
utc 引数が true の場合時刻は UTC になり、それ以外では現地時間が使われます。
backupCount がゼロでない場合、保存されるファイル数は高々 backupCount 個で、それ以上のファイルがロールオーバされる時に作られるならば、一番古いものが削除されます。削除のロジックは interval で決まるファイルを削除するので、 interval を変えると古いファイルが残ったままになることもあります。
delay が true なら、ファイルを開くのは
emit()
の最初の呼び出しまで延期されます。バージョン 2.6 で変更: delay, utc が追加されました。
-
doRollover
()¶ 上述のような方法でロールオーバを行います。
-
emit
(record)¶ 上で説明した方法でロールオーバを行いながら、レコードをファイルに出力します。
-
15.9.7. SocketHandler¶
logging.handlers
モジュールに含まれる SocketHandler
クラスは、ログ出力をネットワークソケットに送信します。基底クラスでは TCP ソケットを用います。
-
class
logging.handlers.
SocketHandler
(host, port)¶ アドレスが host および port で与えられた遠隔のマシンと通信するようにした
SocketHandler
クラスのインスタンスを生成して返します。-
close
()¶ ソケットを閉じます。
-
emit
()¶ レコードの属性辞書を pickle して、バイナリ形式でソケットに書き込みます。ソケット操作でエラーが生じた場合、暗黙のうちにパケットは捨てられます。事前に接続が失われていた場合、接続を再度確立します。受信端でレコードを unpickle して
LogRecord
にするには、makeLogRecord()
関数を使ってください。
-
makeSocket
()¶ サブクラスで必要なソケット形式を詳細に定義できるようにするためのファクトリメソッドです。デフォルトの実装では、 TCP ソケット (
socket.SOCK_STREAM
) を生成します。
-
makePickle
(record)¶ レコードの属性辞書を pickle してから先頭に長さ情報を付けてバイナリ形式にして、ソケットを介して送信できるようにして返します。
pickle が完全に安全というわけではないことに注意してください。セキュリティに関して心配なら、より安全なメカニズムを実装するためにこのメソッドをオーバーライドすると良いでしょう。例えば、 HMAC を使って pickle に署名して、受け取る側ではそれを検証することができます。あるいはまた、受け取る側でグローバルなオブジェクトの unpickle を無効にすることができます。
-
send
(packet)¶ pickle された文字列 packet をソケットに送信します。この関数はネットワークがビジーの時に発生する部分的送信に対応しています。
-
createSocket
()¶ ソケットの生成を試みます。失敗時には、指数的な減速アルゴリズムを使います。最初の失敗時には、ハンドラは送ろうとしていたメッセージを落とします。続くメッセージが同じインスタンスで扱われたとき、幾らかの時間が経過するまで接続を試みません。デフォルトのパラメタは、最初の遅延時間が 1 秒で、その遅延時間の後でそれでも接続が確保できないなら、遅延時間は 2 倍づつになり、最大で 30 秒になります。
この働きは、以下のハンドラ属性で制御されます:
retryStart
(最初の遅延時間、デフォルトは 1.0 秒)。retryFactor
(乗数、デフォルトは 2.0)。retryMax
(最大遅延時間、デフォルトは 30.0 秒)。
これは、リモートリスナがハンドラが使われた 後に 起動すると、 (ハンドラは遅延が経過するまで接続を試みようとさえせず、遅延時間中に黙ってメッセージを落とすだけなので) メッセージが失われてしまうこともあるということです。
-
15.9.8. DatagramHandler¶
logging.handlers
モジュールに含まれる DatagramHandler
クラスは、 SocketHandler
を継承しており、 UDP ソケットを介したログ記録メッセージの送信をサポートしています。
-
class
logging.handlers.
DatagramHandler
(host, port)¶ アドレスが host および port で与えられた遠隔のマシンと通信するようにした
DatagramHandler
クラスのインスタンスを生成して返します。-
emit
()¶ レコードの属性辞書を pickle して、バイナリ形式でソケットに書き込みます。ソケット操作でエラーが生じた場合、暗黙のうちにパケットは捨てられます。事前に接続が失われていた場合、接続を再度確立します。受信端でレコードを unpickle して
LogRecord
にするには、makeLogRecord()
関数を使ってください。
-
makeSocket
()¶ ここで
SocketHandler
のファクトリメソッドをオーバライドして、 UDP ソケット (socket.SOCK_DGRAM
) を生成しています。
-
send
(s)¶ pickle された文字列をソケットに送信します。
-
15.9.9. SysLogHandler¶
logging.handlers
モジュールに含まれる SysLogHandler
クラスは、ログ記録メッセージを遠隔またはローカルの Unix syslog に送信する機能をサポートしています。
-
class
logging.handlers.
SysLogHandler
(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM)¶ 遠隔の Unix マシンと通信するための、
SysLogHandler
クラスの新たなインスタンスを返します。マシンのアドレスは(host, port)
のタプル形式をとる address で与えられます。 address が指定されない場合、('localhost', 514)
が使われます。アドレスは UDP ソケットを使って開かれます。(host, port)
のタプル形式の代わりに文字列で "/dev/log" のように与えることもできます。この場合、 Unix ドメインソケットが syslog にメッセージを送るのに使われます。 facility が指定されない場合、LOG_USER
が使われます。開かれるソケットの型は、 socktype 引数に依り、デフォルトはsocket.SOCK_DGRAM
で、UDP ソケットを開きます。 (rsyslog のような新しい syslog デーモンと使うために) TCP ソケットを開くには、socket.SOCK_STREAM
の値を指定してください。なお、あなたのサーバが UDP ポート 514 を聴取していないなら、
SysLogHandler
が働かないことがあります。その場合は、あなたがドメインソケットに使うべきアドレスが何か調べてください - これはシステム依存です。例えば、Linux システムでは通常 '/dev/log' ですが、 OS/X では '/var/run/syslog' です。あなたのプラットフォームを調べ、適切なアドレスを使うことが必要になります (あなたのアプリケーションがいくつかのプラットフォームで動く必要があるなら、これを実行時に確かめなければならないかもしれません)。 Windows では、UDP オプションを使う必要性がかなり高いです。バージョン 2.7 で変更: socktype が追加されました。
-
close
()¶ 遠隔ホストへのソケットを閉じます。
-
emit
(record)¶ レコードは書式化された後、 syslog サーバに送信されます。例外情報が存在しても、サーバには 送信されません 。
-
encodePriority
(facility, priority)¶ ファシリティおよび優先度を整数に符号化します。値は文字列でも整数でも渡すことができます。文字列が渡された場合、内部の対応付け辞書が使われ、整数に変換されます。
シンボリックな
LOG_
値はSysLogHandler
で定義されています。これはsys/syslog.h
ヘッダーファイルで定義された値を反映しています。優先度
名前 (文字列) シンボル値 alert
LOG_ALERT crit
orcritical
LOG_CRIT debug
LOG_DEBUG emerg
orpanic
LOG_EMERG err
orerror
LOG_ERR info
LOG_INFO notice
LOG_NOTICE warn
orwarning
LOG_WARNING ファシリティ
名前 (文字列) シンボル値 auth
LOG_AUTH authpriv
LOG_AUTHPRIV cron
LOG_CRON daemon
LOG_DAEMON ftp
LOG_FTP kern
LOG_KERN lpr
LOG_LPR mail
LOG_MAIL news
LOG_NEWS syslog
LOG_SYSLOG user
LOG_USER uucp
LOG_UUCP local0
LOG_LOCAL0 local1
LOG_LOCAL1 local2
LOG_LOCAL2 local3
LOG_LOCAL3 local4
LOG_LOCAL4 local5
LOG_LOCAL5 local6
LOG_LOCAL6 local7
LOG_LOCAL7
-
mapPriority
(levelname)¶ ログレベル名を syslog 優先度名に対応付けます。カスタムレベルを使用している場合や、デフォルトアルゴリズムがニーズに適していない場合には、このメソッドをオーバーライドする必要があるかもしれません。デフォルトアルゴリズムは、
DEBUG
,INFO
,WARNING
,ERROR
,CRITICAL
を等価な syslog 名に、他のすべてのレベル名を "warning" に対応付けます。
-
15.9.10. NTEventLogHandler¶
logging.handlers
モジュールに含まれる NTEventLogHandler
クラスは、ログ記録メッセージをローカルな Windows NT, Windows 2000, または Windows XP のイベントログに送信する機能をサポートします。この機能を使えるようにするには、 Mark Hammond による Python 用 Win32 拡張パッケージをインストールする必要があります。
-
class
logging.handlers.
NTEventLogHandler
(appname, dllname=None, logtype='Application')¶ NTEventLogHandler
クラスの新たなインスタンスを返します。 appname はイベントログに表示する際のアプリケーション名を定義するために使われます。この名前を使って適切なレジストリエントリが生成されます。 dllname はログに保存するメッセージ定義の入った .dll または .exe ファイルへの完全修飾パス名を与えなければなりません (指定されない場合、'win32service.pyd'
が使われます - このライブラリは Win32 拡張とともにインストールされ、いくつかのプレースホルダとなるメッセージ定義を含んでいます)。これらのプレースホルダを利用すると、メッセージの発信源全体がログに記録されるため、イベントログは巨大になるので注意してください。 logtype は'Application'
,'System'
,'Security'
のいずれかで、デフォルトは'Application'
です。-
close
()¶ 現時点では、イベントログエントリの発信源としてのアプリケーション名をレジストリから除去することはできます。しかしこれを行うと、イベントログビューアで意図した通りにログが見えなくなるでしょう - これはイベントログが .dll 名を取得するためにレジストリにアクセスできなければならないからです。現在のバージョンではこの操作を行いません。
-
emit
(record)¶ メッセージ ID、イベントカテゴリ、イベント型を決定し、メッセージを NT イベントログに記録します。
-
getEventCategory
(record)¶ レコードに対するイベントカテゴリを返します。自作のカテゴリを指定したい場合、このメソッドをオーバライドしてください。このクラスのバージョンのメソッドは 0 を返します。
-
getEventType
(record)¶ レコードのイベント型を返します。自作の型を指定したい場合、このメソッドをオーバライドしてください。このクラスのバージョンのメソッドは、ハンドラの typemap 属性を使って対応付けを行います。この属性は
__init__()
で初期化され、DEBUG
,INFO
,WARNING
,ERROR
,CRITICAL
が入っています。自作のレベルを使っているのなら、このメソッドをオーバライドするか、ハンドラの typemap 属性に適切な辞書を配置する必要があるでしょう。
-
getMessageID
(record)¶ レコードのメッセージ ID を返します。自作のメッセージを使っているのなら、ロガーに渡される msg を書式化文字列ではなく ID にします。その上で、辞書参照を行ってメッセージ ID を得ます。このクラスのバージョンでは 1 を返します。この値は
win32service.pyd
における基本メッセージ ID です。
-
15.9.11. SMTPHandler¶
logging.handlers
モジュールに含まれる SMTPHandler
クラスは、 SMTP を介したログ記録メッセージの送信機能をサポートします。
-
class
logging.handlers.
SMTPHandler
(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None)¶ 新たな
SMTPHandler
クラスのインスタンスを返します。インスタンスは email の from および to アドレス行、および subject 行とともに初期化されます。 toaddrs は文字列からなるリストでなければなりません。非標準の SMTP ポートを指定するには、 mailhost 引数に (host, port) のタプル形式を指定します。文字列を使った場合、標準の SMTP ポートが使われます。もし SMTP サーバが認証を必要とするならば、 (username, password) のタプル形式を credentials 引数に指定することができます。セキュアプロトコル (TLS) の使用を指定するには secure 引数にタプルを渡してください。これは認証情報が渡された場合のみ使用されます。タプルは、空のタプルか、キーファイルの名前を持つ1要素のタプルか、またはキーファイルと証明書ファイルの名前を持つ2要素のタプルのいずれかでなければなりません。 (このタプルは
smtplib.SMTP.starttls()
メソッドに渡されます。)バージョン 2.6 で変更: credentials が追加されました。
バージョン 2.7 で変更: secure が追加されました。
-
emit
(record)¶ レコードを書式化し、指定されたアドレスに送信します。
-
getSubject
(record)¶ レコードに応じたサブジェクト行を指定したいなら、このメソッドをオーバライドしてください。
-
15.9.12. MemoryHandler¶
logging.handlers
モジュールに含まれる MemoryHandler
は、ログ記録するレコードをメモリ上にバッファリングし、定期的にその内容をターゲット (target) となるハンドラにフラッシュする機能をサポートしています。フラッシュ処理はバッファが一杯になるか、ある深刻度かそれ以上のレベルを持つイベントが観測された際に行われます。
MemoryHandler
はより一般的な抽象クラス、 BufferingHandler
のサブクラスです。この抽象クラスでは、ログ記録するレコードをメモリ上にバッファリングします。各レコードがバッファに追加される毎に、 shouldFlush()
を呼び出してバッファをフラッシュすべきかどうか調べます。フラッシュする必要がある場合、 flush()
がフラッシュ処理を行うものと想定されます。
-
class
logging.handlers.
BufferingHandler
(capacity)¶ 指定した許容量のバッファでハンドラを初期化します。
-
emit
(record)¶ レコードをバッファに追加します。
shouldFlush()
が true を返す場合、バッファを処理するためにflush()
を呼び出します。
-
flush
()¶ このメソッドをオーバライドして、自作のフラッシュ動作を実装することができます。このクラスのバージョンのメソッドでは、単にバッファの内容を削除して空にします。
-
shouldFlush
(record)¶ バッファが許容量に達している場合に true を返します。このメソッドは自作のフラッシュ処理方針を実装するためにオーバライドすることができます。
-
-
class
logging.handlers.
MemoryHandler
(capacity, flushLevel=ERROR, target=None)¶ MemoryHandler
クラスの新たなインスタンスを返します。インスタンスはサイズ capacity のバッファとともに初期化されます。 flushLevel が指定されていない場合、ERROR
が使われます。 target が指定されていない場合、ハンドラが何らかの意味のある処理を行う前にsetTarget()
でターゲットを指定する必要があります。-
flush
()¶ MemoryHandler
の場合、フラッシュ処理は単に、バッファされたレコードをターゲットがあれば送信することを意味します。これと異なる動作を行いたい場合、オーバライドしてください。
-
setTarget
(target)¶ ターゲットハンドラをこのハンドラに設定します。
-
shouldFlush
(record)¶ バッファが一杯になっているか、 flushLevel またはそれ以上のレコードでないかを調べます。
-
15.9.13. HTTPHandler¶
logging.handlers
モジュールに含まれる HTTPHandler
クラスは、ログ記録メッセージを GET
または POST
セマンティクスを使って Web サーバに送信する機能をサポートしています。
-
class
logging.handlers.
HTTPHandler
(host, url, method='GET')¶ HTTPHandler
クラスの新たなインスタンスを返します。host
は特別なポートを使うことが必要な場合には、host:port
の形式で使うこともできます。-
mapLogRecord
(record)¶ URL エンコードされて Web サーバに送信することになる
record
に基く辞書を供給します。デフォルトの実装は単にrecord.__dict__
を返却するだけです。例えば Web サーバに送信したいのはLogRecord
のサブセットのみである、であるとか、あるいはもっと何か特別なカスタマイズが必要である、といった場合には、このメソッドをオーバライド出来ます。
-
emit
(record)¶ レコードを URL エンコードされた辞書形式で Web サーバに送信します。レコードを送信のために辞書に変換するために
mapLogRecord()
が呼び出されます。
注釈
Web server に送信するためのレコードを準備することは一般的な書式化操作とは同じではありませんので、
setFormatter()
を使ってFormatter
を指定することは、HTTPHandler
には効果はありません。format()
を呼び出す代わりに、このハンドラはmapLogRecord()
を呼び出し、その後その返却辞書を Web server に送信するのに適した様式にエンコードするためにurllib.urlencode()
を呼び出します。-
参考
logging
モジュール- logging モジュールの API リファレンス。
logging.config
モジュール- logging モジュールの環境設定 API です。