2016-08-05 1 views
0

注::この質問は、Pythonがロギングによってエラーメッセージを出すという前提に基づいています。答えは、仮定が間違っていることを示しています。Pythonプログラムは残りのコードを実行する前にロギングを設定できますか?


私は、コマンドラインからではなくデーモンによって起動されるプログラムを開発しています。 Stderrはnullデバイスにリダイレクトされます。

通常、メッセージはファイルに記録されますが、何らかのエラーによって通常の起動が妨げられている場合、ヌルデバイスに送信されたため、読み込むエラーメッセージはありません。

このような場合に少しデバッグ時間を節約するために、ちょっとしたこととして、ファイルロガーをルートロガーに追加する少しの "ランチャー"を試しました。

realprogモジュールの意図的な構文エラーでテストしました。 2つの "start"メッセージをファイルに記録しますが、構文エラーのトレースバックはstderrに出力されます。助けてもらえますか?

import logging 

logger = logging.getLogger() 
logger.setLevel(logging.INFO) 
logger.addHandler(logging.FileHandler('test.log')) 
logger.info("logging start") 

def real_start(): 
    # assume e.g. a syntax error in the realprog 
    import realprog 
    realprog.main() 

if __name__ == '__main__': 
    logger.info("program start") 
    real_start() 
+0

エラーメッセージを投稿できますか? – haifzhan

+0

@HaifengZhang:import realprogは、構文エラーが予想通りに失敗します。他のメッセージはありません。その標準的なトレースバック付きの標準メッセージです。ファイルに記録されず、印刷される点を除いて、メッセージ自体には何も問題はありません。このエラーメッセージが必要ですか? – VPfB

答えて

1

あなたは使用することができます

if __name__ == '__main__': 
    logger.info("program start") 
    try: 
     real_start() 
    except Exception: 
     # This will log the traceback. 
     logger.exception("An error ocurred.") 

しかし、あなたは、少なくとも、logging.ERRORにあなたのロガーのレベルを上げる必要があります。

希望すると助かります!

+0

私はそれが動作し、それが役立つことを確認することができます。ありがとう。しかし、メッセージは明確に記録されています。 Pythonが構文エラーについて苦情を申し立てたときのように、ロギングをバイパスしているようです。誰でもこれを確認できますか? – VPfB

+0

'logging'モジュールは、予期している場合に例外をキャッチしません。 – cdonts

+0

私は、Pythonインタプリタがロギングを介してエラーメッセージを発行することを期待していました。 – VPfB

1

あなたの例外をロガーに渡すわけではないので、それを書き込む方法はありません。

real_start()の中に、import文と関数呼び出しをtryに入れて例外を捕捉してログに記録します。

例えば、realprog.main()が数字を0で割ったとすると、例外をログに記録したいので、これを行います。

def real_start(): 
    try: 
     import realprog 
     realprog.main() 
    except ZeroDivisionError as e: 
     logger.info(e, exc_info=True) 

ファイルをチェックすると、その中に例外があるはずです。

+0

はい、私はロギングシステムに例外を渡していません。しかし、それはとにかく印刷されます。そのため、私はPythonインタプリタがそれをしていると仮定しています。 – VPfB

関連する問題