3

Python の標準ログ システムを使用して、アプリケーションのログを記録しています。すべてのタイプのメッセージ (debug から critical まで) をコンソールに出力したいのですが、メッセージ レベルがエラー以上の場合は電子メールも送信したいと考えています。ロギングのドキュメントについて読んでいましたが、少しわかりにくかったです。次のテストをセットアップしましたが、正しく動作していないようです。

 import logging

 log = logging.getLogger('my_test_log')
 sublog = logging.getLogger('my_test_log.sublog')

 log.setLevel(logging.ERROR)
 log.addHandler(logging.StreamHandler())

 sublog.addHandler(logging.StreamHandler())
 sublog.setLevel(logging.DEBUG)     

 sublog.debug('This is a debug message')
 sublog.info('This is an info message')
 sublog.warn('This is a warn message')
 sublog.error('This is an error message')
 sublog.critical('This is a critical message')

注: まだ電子メールをスパム送信したくないので、両方のログを StreamHandler に設定しましたが、技術的には、この状況で電子メールに送信する代わりに、エラーと重要なメッセージを 2 回出力する必要があります。これが機能した後、これをSMTPに変更してメールで送信します

これは、このコードを実行したときの出力です。

This is a debug message
This is a debug message
This is an info message
This is an info message
This is a warn message
This is a warn message
This is an error message
This is an error message
This is a critical message
This is a critical message

基本的に、エラーや重大なメッセージだけでなく、すべてが 2 回出力されます。ここで何が間違っていますか?ありがとう!

4

2 に答える 2

2

After some quick research, it seems that Handler objects don't automatically use their parent Logger's log level. You'll have to set the level yourself.

import logging

log = logging.getLogger('my_test_log')
sublog = logging.getLogger('my_test_log.sublog')

log.setLevel(logging.ERROR)
handler = logging.StreamHandler()
handler.setLevel(logging.ERROR)
log.addHandler(handler)

...
于 2012-09-26T19:21:53.490 に答える
0

問題は、サブログでレベルが DEBUG に設定されていることです。したがって、すべてのメッセージが表示されます (単に ERROR に変更します)。また、logger.propagate が True であることにも問題があります。

これで修正されるはずです:

sublog.propagate = False

これにより、メッセージの重複が停止します。

ロギングに関するドキュメントをここで確認してください。

于 2012-09-26T19:11:54.803 に答える