ログの出力 on Python

Python 2.6

ログの環境設定ファイルの取得が面倒でなければ、printでデバッグするよりいいかも。

■環境設定ファイル(log.conf)
[loggers]
keys=root,app

[handlers]
keys=stream

[formatters]
keys=form
 
[logger_root]
level=NOTSET
handlers=stream

[logger_app]
level=WARNING
handlers=stream
propagate=1
qualname=root.app

[handler_stream]
class=StreamHandler
level=NOTSET
formatter=form
args=(sys.stdout,)

[formatter_form]
format=%(name)s %(asctime)s %(levelname)s "%(message)s"  %(pathname)s
datefmt=
class=logging.Formatter
■構成

設定ファイルのフォーマットはConfigParser形式で記述する。

16.6.14.2. 環境設定ファイルの書式
http://pythonjp.sourceforge.jp/dev/library/logging.html#logging-config-fileformat
[loggers]           # ロガー名を指定
keys=root,app

[handlers]          # ハンドラ名を指定
keys=stream

[formatters]        # フォーマット名を指定
keys=form
 
[logger_root]       # ロガーの設定
level=NOTSET        # ログレベルを指定
handlers=stream     # ハンドラを指定

[logger_app]        # root以外のロガー設定
level=WARNING       # NOTESTの場合、root以外のロガーはrootのログレベルとなる。
handlers=stream
propagate=1         # 上位loggerに通知(0:通知しない、1:通知する)
qualname=root.app   # ロガーのチャネル名を階層的に表示。アプリケーションがこのロガーを取得する際に使う名前。

[handler_stream]    # ハンドラの設定
class=StreamHandler # ハンドラのクラスを指定。ここでは標準出力にログを出力
level=NOTSET        # ログレベルを指定
formatter=form      # フォーマットを指定
args=(sys.stdout,)  # ハンドラクラスのコンストラクタ引数を指定
#その他ハンドラは下記参照
#16.6.8.  Handler オブジェクト:http://pythonjp.sourceforge.jp/dev/library/logging.html#handler

[formatter_form]        # フォーマット設定
format=%(name)s %(asctime)s %(levelname)s %(pathname)s %(message)s
datefmt=                # 日時フォーマット
class=logging.Formatter # フォーマッタのクラス名を指定。通常このまま。
#フォーマットの属性は下記参照
#14.5.6 Formatter オブジェクト:http://pythonjp.sourceforge.jp/dev/library/logging.html#formatter
■プログラム(TestLog.py)
#! /usr/bin/env python
# coding:utf-8

import logging
import logging.config

LOGGING_CONF = 'log.conf'

class SampleLog(object):
    '''
    ログ機能
    '''
    def __init__(self):
        '''
        ログ出力
        '''
        logging.config.fileConfig(LOGGING_CONF)
        
        # rootロガー
        logger = logging.getLogger()
        logger.debug('DEBUG出力の初期化しました')
        logger.info('INFO出力の初期化しました')
        logger.warn('WARNING出力の初期化しました')
        
        # appロガー
        logger = logging.getLogger('root.app')
        logger.info('infoログ')
        logger.debug('debugログ')
        logger.warn('warnログ')
        logger.error('errログ')       

if __name__ == "__main__":
    smp = SampleLog()
■結果
root 2010-11-10 22:54:12,254 DEBUG "DEBUG出力の初期化しました"  /home/yunmaru/work/workspace/fcms/ref/testLog.py
root 2010-11-10 22:54:12,255 INFO "INFO出力の初期化しました"  /home/yunmaru/work/workspace/fcms/ref/testLog.py
root 2010-11-10 22:54:12,255 WARNING "WARNING出力の初期化しました"  /home/yunmaru/work/workspace/fcms/ref/testLog.py
root.app 2010-11-10 22:54:12,255 WARNING "warnログ"  /home/yunmaru/work/workspace/fcms/ref/testLog.py
root.app 2010-11-10 22:54:12,255 WARNING "warnログ"  /home/yunmaru/work/workspace/fcms/ref/testLog.py
root.app 2010-11-10 22:54:12,256 ERROR "errログ"  /home/yunmaru/work/workspace/fcms/ref/testLog.py
root.app 2010-11-10 22:54:12,256 ERROR "errログ"  /home/yunmaru/work/workspace/fcms/ref/testLog.py
■参考
16.6. logging — Python 用ロギング機能
http://pythonjp.sourceforge.jp/dev/library/logging.html#formatter