2011年3月6日日曜日

python:ログ出力

pythonの基本機能にエラーログ記録機能がある。(v2.3以降)

・出力したいメッセージの「重要度」を指定可能。初期値は以下のとおり。
レベル50:CRITICAL(危機)
レベル40:ERROR(エラー)
レベル30:WARNING(警告)
レベル20:INFO(情報)
レベル10:DEBUG(デバッグ)
レベル 0:NOTSET(未指定)


・ログの交代機能あり。
 特定時間や特定容量に達したときに別ファイルに切り替えることができる。

・多彩な出力先に出力可能。
ファイル、標準出力(コンソール画面)、TCP/IPソケット、UPDソケット、電子メールアドレス、システムログ、Windowsのイベントログ、メモリー、HTTPサーバ。


・ログの冗長性を制御可能。
 出力する「最低重要度レベル」を出力先別に指定可能。

参考:
Python2.4ライブラリリファレンス
6.29 logging -- Python 用ロギング機能

試しに、
ログファイルに情報レベル以上
コンソールに警告レベル以上
のメッセージを出してみた。

#
# -*- coding:sjis -*-
#
import sys, logging

def main():
    #メッセージ形式:日時 レベル メッセージ
    ff = "%(asctime)s %(levelname)s %(message)s"
    #日時形式:yyyy/mm/dd hh:mm:dd
    df = "%Y/%m/%d %H:%M:%S"


    ## ログファイルの設定
    #出力対象:情報レベル以上。
    #ログファイル名:当pyファイルと同名.log
    #ファイルモード:新規書込。追加の場合は"a"
    logging.basicConfig(
        level=logging.INFO, format=ff, datefmt=df,
        filename=sys.argv[0][:-3]+".log", filemode="w")
       
    ## 標準出力の設定
    #出力対象:警告レベル以上。
    console = logging.StreamHandler()
    console.setLevel(logging.WARNING)
    formatter = logging.Formatter(fmt=ff, datefmt=df)
    console.setFormatter(formatter)
    logging.getLogger("").addHandler(console)
   
    #レベル名称の変更
    logging.addLevelName(20, "I")   #初期値は"INFO"
    logging.addLevelName(30, "W")   #初期値は"WARNING"
    logging.addLevelName(40, "E")   #初期値は"ERROR"
   
    #テスト
    logging.debug("デバッグメッセージです") #出力されない
    logging.info("情報メッセージです")    #ログファイルに出力
    logging.warning("警告メッセージです") #ログ、コンソール両方に出力
    logging.error("エラーメッセージです") #ログ、コンソール両方に出力

   
if __name__=="__main__": main()

"""結果
コンソール画面:
2011/03/06 01:24:22 W 警告メッセージです
2011/03/06 01:24:22 E エラーメッセージです


ログファイル:
2011/03/06 01:24:22 I 情報メッセージです
2011/03/06 01:24:22 W 警告メッセージです
2011/03/06 01:24:22 E エラーメッセージです
"""