1

この状況にあるim:perlデーモンでいくつかのログファイルを解析しています。このデーモンはデータをmysqldbに書き込みます。

ログファイルは次のことができます。

  1. ローテーションされる(「ファイルサイズといくつかのロジックによって解決される」)
  2. 存在しません(Tailの'ignore_nonexistant'パラメーター)

デーモン:

  1. 殺すことができる
  2. なんらかの理由で死んでしまう可能性があります。

File::Tailを使用してファイルをテールします。作成日またはファイルサイズのファイルローテーションメカニズムが役立ちます。ファイル内のある位置からテールを開始するには、どのメカニズムを使用する必要がありますか?(そのようなデーモンがたくさんあり、ファイルシステムへの書き込みアクセスがないと仮定します)。

DBの位置変数について考えましたが、これは役に立ちません。

おそらく、位置パラメータを親プロセスに渡すための何らかのメカニズムですか?

自転車を作り直したくないだけです。

4

2 に答える 2

2

File :: Tailはすでに回転を検出し、新しいファイルからの読み取りを続行します。

デーモンの停止と再起動に対処するために、デーモンの再起動時に書き込まれた最後のレコードをデータベースに照会し、後の行に到達するまでログファイルの行をスキップできますか?

于 2011-05-18T15:30:18.187 に答える
2

http://search.cpan.org/dist/Log-Unrotate/を試してください。ローカル ファイル システムではなく DB に位置ファイルを保存する場合は、独自のクラスを実装するLog::Unrotate::Cursor必要がありますが、それは簡単なはずです。

私たちは本番環境で 5 年間書き込み、使用Log::Unrotateしてきましたが、データをスキップしないように懸命に努力しています。(たとえば、何らかの理由でリーダーが機能しない間にログが何度もローテーションされた場合など、カーソルが無効になった場合に例外をスローするように懸命に試みますautofix_cursor。この動作を変更するオプションを有効にすることができます)。

http://search.cpan.org/dist/File-LogReader/もご覧ください。私はそれを使用したことはありませんが、同じタスクを解決するはずです。

于 2011-05-19T22:20:58.860 に答える