プロセスロギングについて質問があります。
- a.py、b.py、c.shという3つのスクリプトがあります。
- a.pyはb.pyを呼び出し、b.pyはc.shを呼び出します。
目標は、std out / errを常にログに記録することです(ファイルとコンソールに書き込む)。
現在、次の初期スクリプトを起動しようとしています。
python -u a.py 2>&1 | tee logfile.txt
これで問題は、c.shの出力がb.pyが完全に実行された後にのみ印刷/書き込みされることです。しかし、私はc.shのすべての行が順番に表示されないようにアクティブにしたいと思います。 、全体のプロセスが完了した後に一緒に表示されます)。
これを記録するより良い方法はありますか?それともティーで何とか達成できますか?
ベストアンサー1
私の個人的な意見では、コマンドラインスクリプトまたはアプリケーションで最初にすべきことは、ロギングシステムを設定することです。再利用可能な数行を使用すると、さまざまなデバッグレベルでもすべてのPythonアプリケーションにログインできます。 :)
私はteeを持つファイルにstdoutを書き込むことに基づいてログを記録せずにstdoutとロギングチャネルにログを記録します。私はあなたがPythonスクリプトを変更でき、以下のすべてがこの場合にうまくいくと仮定します。 (「Tシャツの回答を使う」のために下にスクロールしてください。:).
PythonではLoggingモジュールを使用できます(公式のPythonドキュメントでLogging HOWTOを確認してください。https://docs.python.org/2/howto/logging.htmlしかし、残念ながら、他のプロセスは同じファイルに書き込むことはできません(同じプロセスの他のプロセスは可能です)。
したがって、あなたが説明するこのシナリオでは、デフォルトのケースはロギングライブラリまたはsyslogライブラリを使用してsyslogにログインすることです(https://docs.python.org/2/library/syslog.html)。
すべてのアプリケーションでsyslogのlocal0.*機能にログインし、syslog(私の場合はrsyslog)をそのファイルに書き込むことができます。
local0.* /var/log/myapp.log
このシステムの最善の点は、アプリケーションが実行されているコンピュータだけでなく、他のコンピュータのリモートsyslogサーバーにもログインできることです。
PS:アプリケーションログファイルを置き換えるには、/etc/logrotate.d/myappポリシーを設定することを忘れないでください。
ティーオプション
それでも使用する必要がある場合は、2番目と3番目のプロセスでtee
そのフラグを試しましたか?-a
で述べたようにhttp://docstore.mik.ua/orelly/unix/upt/ch13_10.htm:
tee(13.9) コマンドは、標準入力をファイルに書き込み、同じテキストを標準出力に書き込みます。複数のコマンドの出力を収集して、同じファイルに順次送信できます。最も明白な方法は、-aオプションを使用することです。
$いくつかのコマンドTシャツ Tシャツファイル
$その他のコマンド|
$3番目のコマンド|