1: 2016-12-14 (水) 05:36:06 njf |
現: 2017-01-01 (日) 15:15:28 njf |
| *使い方 [#y6ff9a66] | | *使い方 [#y6ff9a66] |
| | | |
- | loggingでの簡単な例は以下の通りです。 | + | **基本的な出力 [#r7dfa599] |
| + | loggingでの簡単な例は以下の通りです。以下の例では「test.log」というファイルに二つのメッセージを出力しています。 |
| | | |
| import logging | | import logging |
| + | |
| logging.basicConfig(filename='test.log',level=logging.DEBUG) | | logging.basicConfig(filename='test.log',level=logging.DEBUG) |
| + | |
| logging.warning('warning test') | | logging.warning('warning test') |
| logging.info('info test') | | logging.info('info test') |
| ログのレベルには以下の物があります。 | | ログのレベルには以下の物があります。 |
| | | |
| + | |レベル|対応メソッド|使いどころ| |
| + | |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」がメッセージです。 |
| + | 出力は |
| + | 2016-12-14 14:57:24,337 message |
| + | といった形となります。 |
| + | |
| + | 他にログレベルを表示する「%(levelname)s」や関数名を表示する「%(funcName)s」、ファイル名を表示する「%(filename)s」などもよく使います。 |
| + | |
| + | **ソースコードの行数を表示する [#u2b92169] |
| + | |
| + | ログの出力で他によくほしくなるものとしてソースコードの行数があります。 |
| + | 「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) |
| | | |
- | &font(Lime){記事制作中}; | + | これを使うと自分用のログ出力関数なども簡単に作れます。 |