1

プログラムのアーキテクチャについて質問があります。さまざまな形式の 100 個の異なるログ ファイルがあり、その情報を解析して SQL データベースに格納する必要があるとします。私の見解は次のようなものです:

  1. 次のような一般的な構成ファイルを使用します。

    program1->name1("apache",/var/log/apache.log) (modulename,path to logfile1)
    program2->name2("exim",/var/log/exim.log) (modulename,path to logfile2)
    
    ....
    
    sqldb->configuration
    
  2. モジュールのようなものを使用します (プログラムごとに 1 ファイル) type1.module (regexp, logstructure(somevariables), sql(tables and functions))

  3. さまざまなプログラムの 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 構造を使用するかを知る必要があります。したがって、これをモジュールのようにすることを計画しています。パラメータ(ログファイル、ファイルタイプ)を使用してメインプロセスをフォークまたはスレッドするだけです。たぶんさらに、解析しないオプションをいくつか追加します(ログレベルが低く、そこに多くのものが表示されない可能性があります)

4

3 に答える 3

0

File::Tail がぴったりだと思います。File::Tail オブジェクトの配列を作成し、次のように select でそれらをポーリングできます。

   while (1) {
       ($nfound,$timeleft,@pending)=
         File::Tail::select(undef,undef,undef,$timeout,@files);
       unless ($nfound) {
              # timeout - do something else here, if you need to
       } else {
           foreach (@pending) {
                # here you can handle log messages depending on filename  
                print $_->{"input"}." (".localtime(time).") ".$_->read;
       }

(perl File::Tail doc より)

于 2011-12-15T21:38:56.380 に答える
0

ログ監視ツールwotsは、ここでの面倒な作業の多くを行うことができます。デーモンとして実行され、必要な数のログ ファイルを監視し、それらに対して perl 正規表現の任意の組み合わせを実行し、一致が見つかったときに何かを実行します。

wotsデータベース書き込みメソッドをサポートするために、(ライセンスが自由に許可している) それ自体を変更する傾向があります - 既存のhandle_*メソッドを見てください。

大変な作業のほとんどはすでに完了しており、興味深い部分に取り組むことができます。

于 2011-05-06T01:19:29.227 に答える
0

私は次のようにします:

  1. appname:logpath:logformatname のようにフォーマットされた構成ファイルを作成します。
  2. 基本パーサー クラスから継承する Perl クラスのコレクションを作成します。
  3. 構成ファイルをロードしてその内容をループし、各反復を適切なハンドラー オブジェクトに渡すスクリプトを作成します。

ステップ 1 と 2 の例が必要な場合は、プロジェクトに 1 つあります。MT::FileMgr および MT::FileMgr::*こちらを参照してください。

于 2011-05-05T14:57:28.227 に答える