3

わかりました、そのタイトルは少し混乱するでしょう。もう少しうまく説明してみましょう。ロギングプログラムを構築しています。プログラムには 3 つの主な状態があります。

  1. 最後の 10 分間のデータのみを保持して、ラウンド ロビン バッファー ファイルに書き込みます。

  2. 時間を無視してバッファファイルに書き込みます (すべてのデータを記録します)。

  3. バッファ ファイル全体の名前を変更し、過去 10 分間のデータで新しいファイルを開始します (状態を 1 に変更します)。

さて、ユースケースはこれです。私たちのネットワークでは、ときどきネットワークのボトルネックが発生しています。そこで、ボトルネックを検出したときに TCP トラフィックを記録するシステムを構築したいと考えています (Nagios 経由の検出)。ただし、ボトルネックが検出されるまでには、有用なデータのほとんどがすでに送信されています。

だから、私が望むのは、常に何かを実行するデーモンを持つことdumpcapです。通常モードでは、過去 10 分間のデータのみが保持されます (不要なデータを大量に保持しても意味がないため)。しかし、Nagios がアラートを出すと、すべてを保存するようにデーモンにシグナルを送ります。その後、Naigos が回復すると、別の信号を送信して保存を停止し、バッファーを保存ファイルにフラッシュします。

さて、問題は、回転する 10 分間のデータをきれいに保存する方法がわからないことです。モード 1 の場合は、10 分ごとに新しいファイルを保存し、古いファイルを削除することもできます。

理想的には、保存されたファイルは、アラートが常にファイルの 10:00 マークにあるようにする必要があります。これは 10 分ごとに新しいファイルを作成することで可能ですが、その時点までファイルを「修復」するのは少し面倒に思えます。

何か案は?ローテーション ファイル システムを実行し、最後にそれらを 1 つに結合する必要がありますか (かなりの後処理を行います)。後処理が不要になるようにセミラウンドロビンファイルをきれいに実装する方法はありますか?

ありがとう

ああ、この段階では言語はそれほど重要ではありません (私は Python に傾倒していますが、他の言語に異論はありません。全体的な設計よりも問題ではありません)...

4

3 に答える 3

4

最初に頭に浮かぶアイデアは、MINUTES+11 分間のファイル (この場合は 11) を保存することです。古いものを捨てる。

リクエストに応じて、現在書き込まれていない 10 個のファイルを 1 つの「大きなログ ファイル」にコピー/マージし、終了した他のすべてのファイルの内容を追加することができます。

繰り返しますが、これは「そのようなもののためのツールが必要です」というタスクのように見え、おそらく誰かがそのためのツールを思いつくでしょう:)

これで解決できない問題の 1 つは、データの最後の X 分間を正確に保持することです。常に 0 秒から開始されます。

于 2011-02-07T16:15:08.697 に答える
1

それはあなたが探しているものとは正確には異なりますが、 MongoDBの上限付きコレクションはあなたが見たいと思うかもしれないものだと思います。

上限付きコレクションは、非常に高性能な自動FIFOエージングアウト機能を備えた固定サイズのコレクションです(エージングアウトは挿入順序に基づいています)。あなたがそれに精通しているなら、それらは「RRD」の概念に少し似ています。さらに、キャップされたコレクションは自動的に高性能になり、コレクション内のオブジェクトの挿入順序を維持します。これは、ロギングなどの特定のユースケースにとって非常に強力です。

したがって、すべてのものを上限付きのコレクションに記録します。このコレクションのサイズは、約10分に相当するデータを格納するように固定されています。Nagiosがシグナルを送信したら、ボトルネックが解消されるまでキャップのないコレクションへの保存に切り替えてから、元に戻します。MongoDBは、一度に10分のファイル全体をシフトアウトするのではなく、行ごとに古いデータのエージングアウトを自動的に処理します。

于 2011-02-11T23:22:58.893 に答える
0

ログの最後の 10 分間だけを取得する利点は何ですか? これを実装するには、古いログを常にチェックしてファイルから削除し、ファイルを上書きする必要があります。このような機能は、SQLite などの一部の DB で簡単に実現できます。

ログのタイムスタンプは、同じ以上のものを提供します。ログファイルにすでに10分のログがある場合は、説明したように2つのログファイルを保持してください-名前を変更し(古いものを上書きして)、新しいファイルへのログ記録を開始します。

于 2011-02-11T12:22:43.823 に答える