興味のある情報を取得するために詳細モードで実行する必要があるアプリケーションがあります。これにより、私の要件に対する関心が1%未満の巨大なログファイルが生成されます。私は興味のある文だけを記録する方法が欲しいです。
このコマンドは、ログを記録するログファイル名を受け入れます。システムサービスとして実行されます。
ログ書き込みステートメントがディスクに書き込まれる前に、どのように傍受して選択できますか?
fifoにファイル名を付けてPythonスクリプトを介して読んでみましたが、あまりにも多くの問題が発生しました。
答え1
fifoにファイル名を付けてPythonスクリプトを介して読んでみましたが、あまりにも多くの問題が発生しました。
これは少なくとも毛皮のオプション。すべての合理的なアプローチには、grep
Pythonスクリプトを使用してもsyslog-ngを使用して手動で実行しても、ストリームフィルタツールを介して出力をパイプ処理することが含まれます。フィルタがすべきことは、入力から1行を読み込み、それを出力に書き込むことです。
ライブラリ関数(例:fwrite()またはsyslog())に対してLD_PRELOADフィルタリングを実行できますが、次のプログラムでのみ機能するライブラリ:使用libcが提供する機能。多くの言語ランタイムはlibc fwrite()を使用せず(Golangには独自のstdioがあります)、LD_PRELOADは静的にリンクされた実行可能ファイルには影響しません。
ptrace() や eBPF または FUSE を使用して OS レベルで write() システムコールを傍受すると、これを防ぐことができますが、ファイルの書き込みは通常プログラムによってバッファリングされるため、これはさらに問題になります。 line write( ) には 8k バッファごとに 1 つの write() 呼び出しがあり、通常は 1 行の途中から始まり、複数行にまたがっています。たとえば、単一のwrite()呼び出しには7つの半行が含まれる可能性があるため、それを傍受すると呼び出し全体を受け入れたり削除したりすることはできません。必要な行だけを維持するには、バッファを分割して再組み立てする必要があります。 、分割行を処理するために状態を維持するこのすべてのPythonあなたのためにやった。
(これは、systemdがseccompとeBPFを使用していても、stdout / stderrではなく、プログラム自体で開いたファイルからいくつかのデータを魔法のようにフィルタリングするsystemdパラメータが見つからないことを意味します。