プログラムのアーキテクチャについて質問があります。さまざまな形式の 100 個の異なるログ ファイルがあり、その情報を解析して SQL データベースに格納する必要があるとします。私の見解は次のようなものです:
次のような一般的な構成ファイルを使用します。
program1->name1("apache",/var/log/apache.log) (modulename,path to logfile1) program2->name2("exim",/var/log/exim.log) (modulename,path to logfile2) .... sqldb->configuration
モジュールのようなものを使用します (プログラムごとに 1 ファイル) type1.module (regexp, logstructure(somevariables), sql(tables and functions))
さまざまなプログラムの fork または thread プロセス (Linux でどちらが優れているかはわかりません)。
質問は、これに対する私の見解は正しいですか? プログラム (web/MTA/iptablat) ごとに 1 つのモジュールを使用する必要がありますか、それとももっと良い方法がありますか? date/time/ip/url のように、いくつかの正規表現は同じだと思います。それをどうするか?または、私は何を逃しましたか?
例: mta exim4 メインログ
2011-04-28 13:16:24 1QFOGm-0005nQ-Ig <= exim@mydomain.org.ua** H=localhost (exim.mydomain.org.ua) [127.0.0.1]:51127 I=[127.0. 0.1]:465 P=esmtpsa X=TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32 CV=no A=plain_server:spam S=763 id= 1303985784.4db93e788cb5c @mydomain.org.ua T= "test" from < exim@exim.mydomain. org.ua > test@domain.uaの場合
太字のものはすべて解析済みで、sqldb.incoming テーブルに格納されます。今、私はperlで構造を持っており、解析されたすべての変数を次のように保持しています$exim->{timstamp} or $exim->{host}->{ip}
私のプログラムは次のようなことを行いtail -f /file
、行ごとに解析します
柔軟性: サポートを Apache サーバーに追加したいとします (ユーザー IP のタイムスタンプとダウンロードされたファイルのみ)。どのログファイルを解析するか、どの正規表現を使用するか、どの SQL 構造を使用するかを知る必要があります。したがって、これをモジュールのようにすることを計画しています。パラメータ(ログファイル、ファイルタイプ)を使用してメインプロセスをフォークまたはスレッドするだけです。たぶんさらに、解析しないオプションをいくつか追加します(ログレベルが低く、そこに多くのものが表示されない可能性があります)