Symfoware

Symfowareについての考察blog

Python loggingモジュールの基本的な使い方

稀に落ちるプログラムの原因を追求するため、ログを仕込む必要に迫られました。
Pythonに標準で用意されているloggingモジュールの使い方を調べた時のメモ書きを
残しておきます。



一番簡単な使い方



単純に標準出力へエラーを表示するだけなら、これだけでOKです。


  1. # -*- coding:utf-8 -*-
  2. import logging
  3. logging.error('エラー')




実行すると、こんな表示になります。

ERROR:root:エラー





エラーとデバッグログを出力しようとしても、

  1. # -*- coding:utf-8 -*-
  2. import logging
  3. logging.error('エラー')
  4. logging.debug('デバッグ')



debugは表示されません。ログの出力レベルの初期値が「WARNING」だからです。

出力するログのレベルを変更するには

logging.basicConfig(level=logging.DEBUG)


としてやります。



  1. # -*- coding:utf-8 -*-
  2. import logging
  3. logging.basicConfig(level=logging.DEBUG)
  4. logging.error('エラー')
  5. logging.debug('デバッグ')




実行すると、DEBUGのメッセージも表示されます。

ERROR:root:エラー
DEBUG:root:デバッグ









ファイルへ出力



ファイルに出力したい場合は、filenameを指定します。

logging.basicConfig(filename='log.txt')



これで、スクリプトと同じ階層にlog.txtというログファイルが出力されるようになります。


デフォルトで、ファイルに追記していきますが、

logging.basicConfig(filename='log.txt', filemode='w')



このように、filemodeにwを指定すると、毎回上書きします。


もちろん、ログの出力レベルを合わせて指定可能です。

logging.basicConfig(level=logging.DEBUG, filename='log.txt')




こんなプログラムを実行すると、

  1. # -*- coding:utf-8 -*-
  2. import logging
  3. logging.basicConfig(level=logging.DEBUG, filename='log.txt')
  4. logging.error('エラー')
  5. logging.debug('デバッグ')




以下の内容が記載されたlog.txtが出力されるかと思います。

ERROR:root:エラー
DEBUG:root:デバッグ








出力フォーマット



ログをファイルに出力できましたが、普通は実行時の時間もほしいと思います。
formatを指定して、実行時の時間も出力するようにします。


  1. # -*- coding:utf-8 -*-
  2. import logging
  3. logging.basicConfig(
  4.     level=logging.DEBUG,
  5.     filename='log.txt',
  6.     format="%(asctime)s %(levelname)s %(message)s")
  7. logging.error('エラー')
  8. logging.debug('デバッグ')




こんなかんじで、時刻もログファイルに出力されるようになりました。


2011-12-27 21:12:55,402 ERROR エラー
2011-12-27 21:12:55,403 DEBUG デバッグ




指定できるフォーマットの形式は、
http://www.python.jp/doc/release/library/logging.html
[15.7.6. LogRecord 属性]に記載されています。

属性名フォーマット説明
argsこのフォーマットを自分で使う必要はないでしょう。msg に組み合わせて message を生成するための引数のタプル。
asctime%(asctime)sLogRecord が生成された時刻を人間が読める書式で表したもの。デフォルトでは “2003-07-08 16:49:45,896” 形式 (コンマ以降の数字は時刻のミリ秒部分) です。
created%(created)fLogRecord が生成された時刻 (time.time() によって返される形式で)。
exc_infoこのフォーマットを自分で使う必要はないでしょう。(sys.exc_info 風の) 例外タプルか、例外が起こっていなければ None 。
filename%(filename)spathname のファイル名部分。
funcName%(funcName)sロギングの呼び出しを含む関数の名前。
levelname%(levelname)sメッセージのための文字のロギングレベル ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')。
levelno%(levelno)sメッセージのための数値のロギングレベル (DEBUG, INFO, WARNING, ERROR, CRITICAL)。
lineno%(lineno)dロギングの呼び出しが発せられたソース行番号 (利用できる場合のみ)。
module%(module)sモジュール (filename の名前部分)。
msecs%(msecs)dLogRecord が生成された時刻のミリ秒部分。
message%(message)smsg % args として求められた、ログメッセージ。 Formatter.format() が呼び出されたときに設定されます。
msgこのフォーマットを自分で使う必要はないでしょう。元のロギングの呼び出しで渡されたフォーマット文字列。 args と合わせて、 message 、または任意のオブジェクトを生成します (任意のオブジェクトをメッセージに使用する 参照)。
name%(name)sロギングに使われたロガーの名前。
pathname%(pathname)sロギングの呼び出しが発せられたファイルの完全なパス名 (利用できる場合のみ)。
process%(process)dプロセス ID (利用可能な場合のみ)。
processName%(processName)sプロセス名 (利用可能な場合のみ)。
relativeCreated%(relativeCreated)dlogging モジュール が読み込まれた時刻に対する、LogRecord が生成された時刻を、ミリ秒で表したもの。
thread%(thread)dスレッド ID (利用可能な場合のみ)。
threadName%(threadName)sスレッド名 (利用可能な場合のみ)。








コンソールとファイルに出力する例



エラーとデバッグログはコンソールに出力。
エラーログのみファイルに出力という感じでログを出力したい場合は、
ハンドラーを複数指定してやればOKです。


  1. # -*- coding:utf-8 -*-
  2. import logging
  3. #コンソールにログを出力するハンドラー
  4. stream_log = logging.StreamHandler()
  5. stream_log.setLevel(logging.DEBUG)
  6. stream_log.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
  7. #ファイルにログを出力するハンドラー
  8. file_log = logging.FileHandler(filename='log.txt')
  9. file_log.setLevel(logging.ERROR)
  10. file_log.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
  11. #getLogger()でrootロガーを取得し、ハンドラーを設定
  12. logging.getLogger().addHandler(stream_log)
  13. logging.getLogger().addHandler(file_log)
  14. #rootロガーのログレベルは、ハンドラーの中で一番低いものを指定しておく
  15. #こうしておかないと、子ハンドラーにエラーが伝播しない
  16. logging.getLogger().setLevel(logging.DEBUG)
  17. logging.error('エラー')
  18. logging.debug('デバッグ')




コンソールには、エラーとデバッグ

2011-12-27 21:49:14,007 ERROR エラー
2011-12-27 21:49:14,008 DEBUG デバッグ




ログファイルには、エラーのみ記録されていると思います。

2011-12-27 21:49:14,007 ERROR エラー




関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2011/12/27(火) 21:53:56|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Python pydocの使い方、書き方とhtml出力の方法 | ホーム | HP ProLiant ML115 G5にインストールしたDebianをWake-on-LANで起動する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/883-49087ac5
この記事にトラックバックする(FC2ブログユーザー)