2017-09-27 9 views
0

WindowsサービスをPythonで書いていますが、答えはthis questionのようにwin32serviceを使用しています。できます。スクリプトがサービスとして実行されているときにPythonエラーを取得する方法

しかし、私がコードを書いているときに、私が間違いを犯すと(例えば、変数名の誤字など)、私が得る唯一のフィードバックはサービスが死ぬということです。

通常のpythonエラーはどこで確認できますか?

編集:私はTimedRotatingFileHandlerを追加すると、かなり私がこれまでに追加しただけのものであると述べている必要があります - はい、それは動作しますが、「で、変数名の接頭辞を忘れたときには、タイプミスをキャッチしたりするために無用です自己。"。私はまだ例外をキャッチして実験しなければならないが、それを働かせても、私の考えではまだ解決策ではなく、本当の解決策である。

+0

あなたはログできますか? tryでラップしてみて、最後に例外を記録してください。 – Carcigenicate

+0

ロギングの出発点:https://docs.python.org/3/howto/logging.html#logging-basic-tutorial –

答えて

0

コードはpywin32を使用していること。そのため、標準

python myservice.py install 
python myservice.py start 

に加えて

python myservice.py debug 

もありますこれは、どちらかのすべてのエラーを提供することはありませんが、多くの場合で貴重な手がかりを提供します。

0

私はまずプログラムを書いてテストし、それをサービスにすることをお勧めします。そうしないと、エラーをトラップしてログファイルに出力することができます。

0

ベストプラクティスは、PyCharmのようなIDEを使用してサービスを開発することです。そのようにして、あなたのために(タイプミスのように)紛らわしいことを見つけることができます。

ロギングシステムを追加してファイルに記録することも非常に重要です。あなたのサービスは通常、異なる特権を持つ特定のユーザーで実行されるため、ファイルのアクセス権に注意する必要があります。

あなたはuser_log_dirプロパティを参照してください(ユーザ・ログ・ディレクトリを計算するAppDirライブラリを使用することができます

その後、あなたはRotatingFileHandlerで回転するログを作成することができ要するに

:。。

logger = logging.getLogger("Rotating Log") 
logger.setLevel(logging.INFO) 

# add a rotating handler 
handler = RotatingFileHandler(path, maxBytes=1024**3, # 1 Mo 
           backupCount=5) 
logger.addHandler(handler) 

もちろん、このロガーはあなたの "main"関数で定義されていなければなりません。

"main" functi onには例外ハンドラが必要です。 exceptions(KeyboardInterruptとSystemExitを除く)をすべてキャッチしてログに記録する必要があります。

要約すると:

def main(): 
    logger = init_logger() 
    try: 
     main_impl() 
    except Exception as exc: 
     logger.error("Last chance exception", exc_info=True) 
     raise SystemExit(1) 
+0

正確には私が探していたものではありませんが、「exc_info =本当の "、私のニーズの80%を達成する。ありがとう。 – jmr

関連する問題