37

Google App Engine で Django-nonrel を使用しているため、print() の代わりに logging.debug() を使用する必要があります。

「ロギング」モジュールは Django によって提供されていますが、print() の代わりに使用するのに苦労しています。

たとえば、変数 x に保持されている内容を確認する必要がある場合は、
logging.debug('x is: %s' % x). しかし、プログラムがすぐに (ストリームをフラッシュせずに) クラッシュした場合、出力されることはありません。

したがって、デバッグのために、プログラムがエラーで終了する前に debug() をフラッシュする必要がありますが、これは発生していません。

4

4 に答える 4

26

1つの(またはデフォルトの)ハンドラーのみを使用していると仮定すると、これはうまくいくと思います:

>>> import logging
>>> logger = logging.getLogger()
>>> logging.debug('wat wat')
>>> logger.handlers[0].flush()

ただし、ドキュメントでは、それは一種の眉をひそめています。

アプリケーション コードは、Handler のインスタンスを直接インスタンス化して使用しないでください。代わりに、Handler クラスは、すべてのハンドラーが持つべきインターフェイスを定義し、子クラスが使用 (またはオーバーライド) できる既定の動作を確立する基本クラスです。 http://docs.python.org/2/howto/logging.html#handler-basic

パフォーマンスが低下する可能性がありますが、本当に行き詰まっている場合は、これがデバッグに役立つ場合があります。

于 2012-12-06T22:39:21.797 に答える
6

Django のロギングは、標準の python ロギング モジュールに依存しています。

このモジュールにはモジュールレベルのメソッドがあります:logging.shutdown()すべてのハンドラーをフラッシュし、ロギング システムをシャットダウンします (つまり、ロギングは呼び出された後は使用できなくなります)。

この関数のコードを調べると、現在 (python 2.7) ロギング モジュールは _handlerList というモジュール レベルの変数にすべてのハンドラーへの弱い参照のリストを保持しているため、次のようなことを行うことですべてのハンドラーをフラッシュできます。

[h_weak_ref().flush() for h_weak_ref in logging._handlerList]

このソリューションはモジュール @Mikes ソリューションの内部を使用するため、より優れていますが、ロガーへのアクセスに依存しているため、次のように一般化できます。

 [h.flush() for h in my_logger.handlerList]
于 2013-08-02T09:03:06.633 に答える