ページへ戻る

− Links

 印刷 

Python​/loggingを使ったログの出力 :: NJF Wiki

xpwiki:Python/loggingを使ったログの出力

ページ内コンテンツ
  • 導入
  • 使い方
    • 基本的な出力
    • 日付と時間の出力
    • ソースコードの行数を表示する

導入 anchor.png[1] Edit [2]

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

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

Page Top

使い方 anchor.png[3] Edit [4]

Page Top

基本的な出力 anchor.png[5] Edit [6]

loggingでの簡単な例は以下の通りです。以下の例では「test.log」というファイルに二つのメッセージを出力しています。

import logging

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

logging.warning('warning test') 
logging.info('info test')

「basicConfig」でファイル名「filename」を指定するとそのファイルにログを追記していきます。 もしファイル名を指定しないと標準出力にログが出力されます。 開発中はコンソールにログを出力、開発が終わったあとでファイルに出力といったことも簡単にできます。

ログのレベルには以下の物があります。

レベル対応メソッド使いどころ
DEBUGdebugデバック用の情報など
INFOinfo予定通りのことが起こった場合など
WARNINGwarning問題が起こりそうな場合の警告
ERRORerror一部の機能が実行できないようなエラー
CRITICALcriticalプログラム自体が実行できない重大なエラー

表の下に行くほど重要なログで、出力されやすくなります。

例えばログのレベルをINFOにしていると、DEBUGレベルであるdebugメソッドのログは出力されず、残りのinfo、worning,error、criticalが出力されます。

これ以外に例外発生時のみに使う「exception」やレベルを指定して実行するlogメソッドもあります。

logging.log(logging.DEBUG,"デバッグ")

これらのメソッドの引数はマルチバイト文字があってもStr型でもUnicode型でも出力できます。

また

logging.info('info %s',"test")

のように「%」書式を使うこともできます。

Page Top

日付と時間の出力 anchor.png[7] Edit [8]

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」などもよく使います。

Page Top

ソースコードの行数を表示する anchor.png[9] Edit [10]

ログの出力で他によくほしくなるものとしてソースコードの行数があります。 「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)

これを使うと自分用のログ出力関数なども簡単に作れます。


Last-modified: 2017-01-01 (日) 07:15:28 (JST) (2664d) by njf