導入
Pythonでの開発中、コンソールから実行するプログラムの場合は「print」を使って情報を表示しながら開発するのが一番楽です。しかし、運用が始まってからのシステムの情報や、Webシステムのようにコンソールからずっと情報を表示し続けるわけには行かない物も多くあります。
そんなとき、「logging」を使うと簡単にログをファイルなどに出力できるので便利です。
基本的な出力
loggingでの簡単な例は以下の通りです。以下の例では「test.log」というファイルに二つのメッセージを出力しています。
import logging logging.basicConfig(filename='test.log',level=logging.DEBUG) logging.warning('warning test') logging.info('info test')
「basicConfig」でファイル名「filename」を指定するとそのファイルにログを追記していきます。 もしファイル名を指定しないと標準出力にログが出力されます。 開発中はコンソールにログを出力、開発が終わったあとでファイルに出力といったことも簡単にできます。
ログのレベルには以下の物があります。
レベル | 対応メソッド | 使いどころ |
DEBUG | debug | デバック用の情報など |
INFO | info | 予定通りのことが起こった場合など |
WARNING | warning | 問題が起こりそうな場合の警告 |
ERROR | error | 一部の機能が実行できないようなエラー |
CRITICAL | critical | プログラム自体が実行できない重大なエラー |
表の下に行くほど重要なログで、出力されやすくなります。
例えばログのレベルをINFOにしていると、DEBUGレベルであるdebugメソッドのログは出力されず、残りのinfo、worning,error、criticalが出力されます。
これ以外に例外発生時のみに使う「exception」やレベルを指定して実行するlogメソッドもあります。
logging.log(logging.DEBUG,"デバッグ")
これらのメソッドの引数はマルチバイト文字があってもStr型でもUnicode型でも出力できます。
また
logging.info('info %s',"test")
のように「%」書式を使うこともできます。
日付と時間の出力
loggingの出力はデフォルトでは
INFO:root:info test
のようになっています。 つまり「ログレベル:階層:メッセージ」です。 階層はloggerの階層だそうですが、あまり使いそうにないので気にしなくても良いと思います。
実際に使う時には日付と時間がないと、実用にはならないでしょう。 普段運用しているシステムならもちろん、開発中でもデバッグがうまくいかないと思っていたら、実は古いログを見ていたというのは「開発者あるある」の一つです。日付と時間はなるべく早い段階で入れるのがおすすめです。
「日付:メッセージ」とするには「logging.basicConfig」にformatを指定します。
logging.basicConfig(filename='test.log',format = "%(asctime)s:%(message)s",level=logging.DEBUG)
ここで「%(asctime)s」が日付と時間で、「%(message)s」がメッセージです。 出力は
2016-12-14 14:57:24,337 message
といった形となります。
他にログレベルを表示する「%(levelname)s」や関数名を表示する「%(funcName)s」、ファイル名を表示する「%(filename)s」などもよく使います。
ソースコードの行数を表示する
ログの出力で他によくほしくなるものとしてソースコードの行数があります。 「logging」にその機能はありませんが、「inspect」を使えば簡単に表示できます。
import logging import inspect logging.info('line:%d',inspect.currentframe().f_lineno)
他に関数名やファイル名などもとれますが、前節にご紹介したようにこれらはloggingにも表示する機能があります。しかし、inspectの便利な機能として、関数の呼び出しスタックをさかのぼる「f_back」をがあります。これを使えば呼び出し元の情報がとれます。
例えば、以下のようにすると、「logTest」関数が実行された場所をログ出力できます。
def logTest(): logging.info('function:%s',inspect.currentframe().f_back.f_code.co_name) logging.info('filename:%s',inspect.currentframe().f_back.f_code.co_filename)
これを使うと自分用のログ出力関数なども簡単に作れます。
ぺージ情報 | |
---|---|
ぺージ名 : | Python/loggingを使ったログの出力 |
ページ別名 : | 未設定 |
ページ作成 : | njf |
閲覧可 | |
グループ : | すべての訪問者 |
ユーザー : | すべての訪問者 |
編集可 | |
グループ : | すべての訪問者 |
ユーザー : | すべての訪問者 |