6

質問がありますが、stackoverflow や Web のどこにもヘルプが見つかりませんでした。

プログラム (セロリ分散タスク キュー) があり、それぞれがログファイル (celery_worker1.log、celery_worker2.log) を持つ複数のインスタンス (ワーカー) があります。

重要なエラーはデータベースに保存されますが、新しい操作を実行するときにこれらのログを時々追跡して、すべてが正常であることを確認するのが好きです (ログレベルは低くなります)。

私の問題: これらのログは多くのディスク容量を使用しています。私がしたいこと: 必要なときにだけログ (tail -f) を「監視」できるようにします。

今までの私の考え:

  • ログをファイルではなく stdout に出力する: さまざまなファイルに出力する多くのワーカーがあるため、ここでは不可能ですが、それらをすべて一度に追跡したい (tail -f celery_worker*.log)
  • logrotate の使用: それは私にとって「OK」な解決策です。私はこれを毎日のタスクにしたくありませんが、これのために crontab を 1 分も置きたくありません。さらに、サーバーは私のものではないため、admin-sys 側で何らかの作業が行われることを意味します。
  • 名前付きパイプの使用: 一見良さそうに見えましたが、名前付きパイプ (Linux FIFO) がどこでブロックされているかわかりませんでした。したがって、すべてのパイプを同時に tail -f しない場合、またはテールを終了した場合、ロガーからの書き込み操作がブロックされます。

末尾のときに標準出力にスローし、そうでないときに /dev/null にスローするノンブロッキングの名前付きパイプを持つ方法はありますか?

それとも、そのようなタイプのパイプには技術的な問題がありますか? ある場合、それらは何ですか?

回答ありがとうございます。

4

2 に答える 2

1

各ワーカーのログを stdout に記録しますが、サイズまたは時間に基づいてログを自動的にスプールおよびローテーションするユーティリティに各 stdout を接続します。 multilogsvlogdはその例です。これらのプログラムの場合は、「現在の」ログ ファイルを追跡するだけです。

logrotate は、あなたが抱えている問題に対する適切な解決策ではないというのは正しいです。

名前付きパイプは思い通りには機能しません。せいぜい、ライターはパイプをいっぱいにしてから、後続のログを破棄することができます。これは、必要な動作の逆です。

于 2013-02-27T21:50:46.110 に答える
1

共有メモリ デバイスman:shm_overviewを試すか、いくつかのデバイスを試すことができます。それらを循環バッファーとして整理して、ログの最後の N kb を保存し、リーダーで読み取るたびにすべてをコンソールに出力する必要があります。このアプローチは、busybox の syslog/logread スーツ ( logread.c を参照) で採用されています

于 2013-02-28T00:13:26.210 に答える