ラベル ログ の投稿を表示しています。 すべての投稿を表示
ラベル ログ の投稿を表示しています。 すべての投稿を表示

2008年9月13日土曜日

Pyscripter で UnitTest と logging - 問題のあった行へジャンプ

PyScripter で UnitTest を自動で生成」の続き。

 

次の 4 つの仕組みがあるおかげで、プログラムを書くことができると言っても過言ではない。

  1. assert 文 でメソッドの事前条件をチェック。
  2. UnitTest でメソッドの結果をチェック。
  3. logging でおかしな値をログに出力。
  4. デバッガで動作を追う。

一画面に納まる程度のスクリプトなら大丈夫だけれど、それ以上になると、もうダメなすぐに忘れる脳みそ。 (+_+) 上記の仕組みを作ってくれた人に感謝・感謝。 ^人^ それプラス軽くて使いやすい IDE、 Pyscripter があるから Python でスクリプトを書く気になれる。

ポカミスなんて当り前。バグなく一発で動かせることなんて滅多にない。だから、逆に何もなく動いたときには、「本当はどこか間違っているんじゃないか」 (@_@;) と疑ってしまう。そんなバグとお友達な自分は、Pyscripter ・ logging において次のような設定と使い方をしている。

 

行番号の表示

まずは、ソースコードにおいて行番号が表示されるようにする。エラーがでたときには、ファイル名と行番号が出力されるので、行番号が表示されていた方が使いやすい。また、ちょっとだけ現在編集している場所から離れるときに、行番号を見て覚えておけば、元の場所に戻りやすい。

方法は、ツールバーのボタンで、行番号の表示・非表示を切り替える。以下のボタンが表示されてないときは、View > Toolbars >Editor Toolbar をチェックする。

080913-002

 

または、次のように設定できる。

  1. メニューより 「Tools > Options > Editor Options
  2. Display タブ > Gutter の `Show line numbers' をチェックする。

 080913-001

 

UnitTest で問題が発生した場所へジャンプ

UnitTest を実行し、失敗またエラーがあった場合、ファイルのどの位置で発生したかについて、画面下部の Python Interpreter ペインに赤字で表示される。このとき、行番号が書かれている行でダブルクリックをすると、その位置へジャンプしてくれる。

080913-004

 

出力が一杯になって見にくくなったら、Python Interpreter ペインの中で、すべて選択 (Ctrl + A)、 Delete 。

 

ログの出力行へジャンプ

ログの出力の方法については、6.29.2 基本的な使い方を参照。 (cf. Google App Engine (Python) でログを出力 )

ログの設定を次のようにしておく。

    logging.basicConfig(level=logging.DEBUG,
        format='%(asctime)s %(levelname)s ' + \
               '"%(pathname)s", line %(lineno)d, %(message)s')

ログの出力フォーマットについては、6.29.6 Formatter オブジェクトを参照。

 

例えば次のログ出力、

logging.debug(u"こんにちは、バグです!")

の結果は、

2008-09-13 11:40:37,125 DEBUG "c:\develop\src\python\liquorchecksimple\liquortest.py", line 174, こんにちは、バグです!

Pyscripter の Python Interpreter ペインで、出力された行をクリックすると、その場所へジャンプしてくれる。上記のように書式を設定した理由は、UnitTest の出力を真似すれば Pyscripter がその行へジャンプしてくれるかと思って。

 

テンプレート
import logging



if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG,
        format='%(asctime)s %(levelname)s ' + \
               '"%(pathname)s", line %(lineno)d, %(message)s')
    logging.getLogger().setLevel(logging.DEBUG)

2008年8月27日水曜日

Google App Engine (Python) でログを出力

1. ログを出力するための概略

Logging Events in Your Application - Google App Engine - Google Code の説明に従った。

概略は次の通り。

  1. loggin モジュールのインポート。
  2. ログを出力するレベルをアプリケーションにおいて設定する。
  3. loggin のメソッドを使って出力したいログの内容を書く。

 

2. logging モジュール

まず、logging モジュールをインポートする。

import logging

 

3. ログのレベルに対応したメソッド

logging のメソッドには、debug(), info(), error() などがあり、

14.5 logging -- Logging facility for Python によると、

Logged messages also have levels of importance associated with them. The default levels provided are DEBUG, INFO, WARNING, ERROR and CRITICAL.

(太字は引用者による)

ログとして出力するメッセージに「レベル」を設定できる。そして、それぞれのレベルに対応したメソッドが定義してある。

The methods are debug(), info(), warning(), error() and critical(), which mirror the default levels.

(同上より、太字は引用者による)

ログのレベルについては、以下のような段階がある。

ちなみに、この loggin はドキュメントに

New in version 2.3.

とあるように、Python のライブラリに含まれている。

 

4. ログを出力するレベルの設定

app.yaml の handlers で指定してある、script のmain 関数において、次のように記述する。

logging.getLogger().setLevel(logging.DEBUG)

上記のように設定すると、DEBUG レベル以上のログが出力されるようになる。

 

5. 出力された結果

Web アプリケーションを起動したときのコマンドラインにおいて、次のように表示された。

080827-003

ブラウザにおいては、アプリケーションの URL に

?debug

を追加すると、ログを表示するウィンドウが表示される。

080827-005

 

6. logging のみを試す

Google App Engine を使わずに、Python の一ファイルで、上記を真似てみる。

import logging

# ログの出力レベルを設定
logging.getLogger().setLevel(logging.INFO)

logging.error("hoge")
logging.warning("piyo")
logging.info("fuga")
logging.debug("hogehoge")

これを実行すると結果は、

ERROR:root:hoge
WARNING:root:piyo
INFO:root:fuga

ログを出力するレベルを INFO にしたので、それ以上のレベルがログとして表示されていない。 DEBUG は INFO よりも下なので表示されていない。

 

参考