ページへ戻る

− Links

 印刷 

Python​/loggingを使ったログの出力 のバックアップソース(No.4) :: NJF Wiki

xpwiki:Python/loggingを使ったログの出力 のバックアップソース(No.4)

« Prev[5]  Next »[6]
*導入 [#ob8d33b1]

Pythonでの開発中、コンソールから実行するプログラムの場合は「print」を使って情報を表示しながら開発するのが一番楽です。しかし、運用が始まってからのシステムの情報や、Webシステムのようにコンソールからずっと情報を表示し続けるわけには行かない物も多くあります。

そんなとき、「logging」を使うと簡単にログをファイルなどに出力できるので便利です。

*使い方 [#y6ff9a66]

**基本的な出力 [#r7dfa599]
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")
のように「%」書式を使うこともできます。

**日付と時間の出力 [#pba4f949]

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」がメッセージです。

**ソースコードの行数を表示する [#u2b92169]

ログの出力で他によくほしくなるものとしてソースコードの行数があります。
「logging」にその機能はありませんが、「inspect」を使えば簡単に表示できます。

 import logging
 import inspect

 logging.info('line:%d',inspect.currentframe().f_lineno)

他に関数名やファイル名などもとれます。
 logging.info('function:%s',inspect.currentframe().f_code.co_name)
 logging.info('filename:%s',inspect.currentframe().f_code.co_filename)


« Prev[5]  Next »[6]