質問
アプリのロギング機能全体を統合したい。警告は例外を発生させ、次にそれをキャッチしてロガーに渡します。しかし、質問:ミュート機能のロギングにはありますか?ロガーが冗長になりすぎる場合があります。ノイズの多い警告の理由で、警告に冗長な制限がありますか?
解決
ログレベルだけでなく、本当に柔軟な設定方法。名前付きの logger
オブジェクト(たとえば、 logger = logging.getLogger(...)
)を使用している場合、適切に設定できます。これにより、サブシステムがロギング階層によって定義されるサブシステムごとに冗長性を構成できます。
もう1つのオプションは、 logging.Filter
および警告フィルターで出力を制限します。私は以前にこの方法を使用したことはありませんが、あなたのニーズにより適しているようです。
PEP-282 の説明文を読むPython logging
パッケージ。モジュールのドキュメントよりも機能のほうがはるかに優れていると思います。
明確化後に編集
logging.Logger
に基づいて、 logging.setLoggerClass()
に登録されたカスタムクラスを使用して、このロギング部分を処理できる場合があります。 syslogの"最後のメッセージが9回繰り返される" に似たものが欲しいようです。残念ながら、私はこれの実装をどこにも知りません。 twisted.python.log がサポートしているかどうかを確認したい場合があります。この機能。
他のヒント
あなたが言及したまさにそのソースから。 ログレベルがあり、賢明に使用してください;-)
LEVELS = {'debug': logging.DEBUG,
'info': logging.INFO,
'warning': logging.WARNING,
'error': logging.ERROR,
'critical': logging.CRITICAL}
これは、エラーを発生させたコードについて何も知らないブラインドエラーハンドラーからすべてのロギング呼び出しを行う場合に問題になります。これは質問のように聞こえます。どのロギングコールが行われ、どれが行われないかをどのように決定しますか?
より標準的な方法は、可能であればそのようなブロックを使用して回復し、エラーをログに記録することです(実際、特に準備ができていないエラーの場合は、知りたい、高レベルを使用します) 。ただし、すべての状態/デバッグ情報をこれらのブロックに依存しないでください。エラーハンドラーに到達する前に、ログを呼び出してコードを振りかける方が良いでしょう。そうすれば、システムに障害が発生していないときにシステムに関する有用な実行時情報を観察でき、異なる重大度のログ呼び出しを行うことができます。例:
import logging
from traceback import format_exc
logger = logging.getLogger() # Gives the root logger. Change this for better organization
# Add your appenders or what have you
def handle_error(e):
logger.error("Unexpected error found")
logger.warn(format_exc()) #put the traceback in the log at lower level
... #Your recovery code
def do_stuff():
logger.info("Program started")
... #Your main code
logger.info("Stuff done")
if __name__ == "__main__":
try:
do_stuff()
except Exception,e:
handle_error(e)