0

リアルタイム実行スクリプトによって記録されるログ ファイルがあります。今度は WEB/HTML のログからスクリプトのステータスを監視するので、JavaScript を使用して WEB/HTML を更新します。ログを解析し、JavaScript の読み取り用にイベント ステータスを JSON に出力する 1 つの CGI スクリプト。JS スクリプトは、定期的に (たとえば 2 秒ごとに) CGI を呼び出してログを解析し、getJSON を呼び出してイベント ステータスを読み取り、WEB を更新します。

例えば。時間 T (秒) に、ログ ファイルに次のように記録されます。

イベント1開始…

イベント 1 を実行中 ...

イベント1パス ...

イベント1終了…

T+2 (秒) の時点で、ログ ファイルには次のように記録されます。

イベント1開始…

イベント 1 を実行中 ...

イベント1パス ...

イベント1終了…

イベント2開始…

イベント 2 を実行中 ...

イベント 2 失敗 ...

イベント2終了…

時間 T(秒) の CGI は次のように出力します。

{"イベント":[["イベント 1", "パス"]]}

JS の getJSON によって読み取られる URI で

時間 T+2(second) では、次のように出力されます。

{"イベント":[["イベント 1", "合格"],["イベント 2", "不合格"]]}


ここで、実装した CGI スクリプトは 2 秒ごとにログ全体を解析します。これは、ログが大きい場合に大量のシステム リソースを消費し、既に実行されたイベントに対して繰り返し処理を行う可能性があります。

ログ全体ではなく、出力によってログを段階的に解析する方法と、既に完了したイベントのステータスを保存する方法を知っている人はいますか?

4

1 に答える 1

1

毎回ログ ファイル全体を解析したくない場合は、tail -fの動作を模倣するようにしてください。

  • ログを開き、すべてを解析します (初回)。
  • getposでカーソル位置を取得します。
  • inode番号を取得し、mtimestat使用します。
  • カーソルと inode を別のファイルに保存します。

次の呼び出しが到着したら、i ノード番号を保存したものと比較します。

  • 変更されている場合は、ファイルが変更されています (logrotate の後など)。最初から読み始める必要があります。
  • が変更されている場合はmtime、 で古い位置に移動しsetpos、解析を再開します。
  • そうでなければ、何も変わっていません。

このソリューションを使用すると、ファイルのチャンクをチャンクごとに解析できます。行の一部だけが書き込まれている場合、まれなケースが発生する場合があることに注意してください。

編集:@mobのコメント

于 2013-01-18T16:29:33.647 に答える