7

現在、 pyftpdlibモジュールの 1.0.0 リリースに取り組んでいます。この新しいリリースでは、特定の API がバイトではなく Unicode を受け入れるようになるという下位互換性のない変更が導入されます。私がそれに取り組んでいる間、この破損の一部として、現在 print ステートメントを使用しているロギング関数を取り除き、代わりにロギング モジュールを使用する可能性を考えていました。

現在、pyftpdlib はロギングを 3 つの関数に委任しています。

def log(s):
   """Log messages intended for the end user."""
   print s

def logline(s):
   """Log commands and responses passing through the command channel."""
   print s

def logerror(s):
   """Log traceback outputs occurring in case of errors."""
   print >> sys.stderr, s

ログをカスタマイズする (たとえば、ログをファイルに書き込む) ことを希望するユーザーは、次のようにこれら 3 つの関数を上書きすることになっています。

>>> from pyftpdlib import ftpserver
>>>
>>> def log2file(s):
...        open('ftpd.log', 'a').write(s)
...
>>> ftpserver.log = ftpserver.logline = ftpserver.logerror = log2file

今、私は疑問に思っています:このアプローチを取り除き、代わりにロギングモジュールを使用することにはどのような利点がありますか? モジュール ベンダーの観点から、モジュールでロギング機能を公開するにはどうすればよいですか? 私はこれを行うことになっていますか:

import logging
logger = logging.getLogger("pyftpdlib")

...そして、「ロガー」は、ユーザーがログの動作をカスタマイズしたい場合に使用することになっているオブジェクトであるとドキュメントに記載されていますか? 次のように、事前定義された形式の出力を意図的に設定することは正当ですか?

FORMAT = '[%(asctime)] %(message)s'
logging.basicConfig(format=FORMAT)
logger = logging.getLogger('pyftpdlib')

...?

ロギング機能が公開され、パブリック API の一部として統合されている場所から手がかりを得ることができるサードパーティ モジュールを思いつきますか?

前もって感謝します。

4

4 に答える 4

3

ライブラリ (ftp サーバーまたはクライアント ライブラリ) は、ログ システムを初期化してはなりません。そのため、ロガー オブジェクトをインスタンス化し、ドキュメントで logging.basicConfig を指定しても問題ありません (または、basicConfig の行に沿って、より洗練された出力を備えた関数を提供し、ユーザーがロギング構成戦略、プレーンな basicConfig またはライブラリ提供の構成から選択できるようにします)。

フレームワーク (django など) またはサーバー (ftp サーバー デーモン) は、ログ システムを適切なデフォルトに初期化し、ログ システム構成のカスタマイズを許可する必要があります。

于 2012-05-21T08:09:01.807 に答える
2

通常、ライブラリは単に何もしないハンドラであるNullHandlerハンドラを作成する必要があります。ライブラリを使用するエンド ユーザーまたはアプリケーション開発者は、ログ システムを構成できます。詳細については、ドキュメントの「ライブラリのログの構成」セクションを参照してください。logging特に、次の注記を参照してください。

NullHandlerライブラリのロガー以外にハンドラーを追加しないことを強くお勧めします。

あなたの場合、ログのドキュメントに従って、ログハンドラーを作成するだけです。

import logging
logging.getLogger('pyftpdlib').addHandler(logging.NullHandler())

編集質問でスケッチされたロギングの実装は、完全に合理的なようです。ドキュメントでは、ライブラリからの出力をカスタマイズするためのおよびメソッドについて言及loggerし、議論するか、ユーザーに指示してください。を使用するのではなく、出力の設定を管理し、ドキュメントのどこかに構成ファイルを文書化するために を使用することを検討できます。このファイルで期待される形式のロギング モジュール ドキュメントをユーザーに再び示します。logging.setLevellogging.setFormatterlogging.basicConfig(format=FORMAT)logging.config.fileConfig

于 2012-05-21T08:46:50.030 に答える
0

Django(サンプルプロジェクトを作成するだけ)を見て、ロガーサブシステムを初期化する方法を確認できます。

私が少し前に書いたコンテキストロガーヘルパーもあります-このロガーは自動的にモジュール/クラス/関数の名前を取得します。これは、モジュールがメッセージを吐き出し、コールフローがどのように進行するかを直接確認できるデバッグメッセージに非常に役立ちます。

于 2012-05-21T07:02:33.250 に答える
0

これは、カスタマイズ可能なロガーを作成するために使用したリソースです。あまり変更はしていません。if ステートメントを追加しただけで、ログをファイルに記録するかコンソールだけに記録するかを指定しました。

このColorerをチェックしてください。出力を色分けするのに非常に便利なので、DEBUG は INFO とは異なる WARN とは異なるように見えます。

Logging モジュールには、SMTP ロギング、ファイル ローテーション ロギングなど、多くの優れた機能がバンドルされています (そのため、古いログ ファイルをいくつか保存できますが、問題が発生するたびに何百ものログ ファイルを作成する必要はありません)。

Python 3 に移行する場合は、logging モジュールを使用すると、print ステートメントを変更する必要がなくなります。

ロギングは、何をしているかにもよりますが、プログラムのどこにいるかを確認するために軽く使用しただけです (この関数を実行している場合は、このように色を付けます)。ステートメントを印刷します。

于 2012-05-21T02:56:10.267 に答える