ログファイルエントリをMySQLデータベースにインポートする正しい/効率的/信頼できる方法は何ですか?

ログファイルエントリをMySQLデータベースにインポートする正しい/効率的/信頼できる方法は何ですか?

乱用パターンを識別するためにサーバーアクセスログファイルを照会できるようにしたいです。ログファイルは実際には照会するのは簡単ではなく、各ヒットがMySQLデータベースの行である場合は、必要な操作を実行するのはかなり簡単です。

Webサーバーを変更したり、要求の応答時間を遅くしたりするモジュールを使用したくありません。 Webサーバーはテキストログにエントリを記録するように最適化されており、そうしたいと思います。つまり。 Webサーバーがファイルに書き込んで、後でバッチ処理でファイル項目をデータベース項目に移動するようにします。

PHPは私にとって最も身近なサーバーサイド言語です。ファイルを開き、1行ずつ解析し、その行をデータベースに挿入するのは簡単です。問題は、アクセスログが機関銃のように記録されることです。 Webサーバーがログに書き込もうとしている間、PHPはログを解析できません。 Webサーバーは、PHPが解析中に忍耐強く待つことはできません。

重複したアイテムをインポートしたり、アイテムが欠落せずに同時にタスクを実行する方法が必要です。

だから私は2つのアイデアを持っています。まず、回転したログのみを処理しますaccess.log.1。これにより、リアルタイムのパフォーマンスが低下しますが、同じリソースを配置して競合する2つのプログラム間の競合を回避できます。 PHPがログを読み取るときにログを回転させようとするログ回転の問題はまだ残っています。これは、特に反復中にファイル名を再利用するためです。同じログを再度読み取るか、名前の競合によって失われないようにする方法が必要です。

次に、キューをパイプのように使用できます。私は以前にパイプを使ったことがないので、それがどのように機能するのかわかりません。場合:

  1. Webサーバーはそれを通常のファイルとして扱い、
  2. Webサーバーは、再起動時に通常のファイルに置き換えようとしませんでした。
  3. パイプは、PHPが呼び出され、エントリが最後から削除されるまで、順序付けられたキューのテキストエントリのみを保持します。
  4. 入り口の部分を引いて取り除きます...

それなら私が探しているのがまさにそれだったかもしれません。問題は、PHPを呼び出してパイプからコンテンツをインポートしてから終了することで、後でcronで再度呼び出すことができるかどうかです。それともパイプを使用するには、PHPはデーモンのように継続的に実行する必要がありますか?つまり、パイプの反対側の端に何もなければ、パイプはファイルのようにまだ物を入れることができますか?

それとも、ページサービスの時間を遅らせずにデータベースのログを安全かつ確実に読み取ることができる他の方法はありますか?

関連情報