syslog-ng の csv-parser から値を抽出する

syslog-ng の csv-parser から値を抽出する

csv 形式の syslog フィードが csv-parser を使用して syslog-ng に取り込まれ、ディスクに書き込まれています。

私の理解では、csv-parser を使用すると、syslog-ng に、入ってくるデータのコンテキストと、その値が何を意味するかが提供されるはずです。そのコンテキストを使用して、syslog-ng がそのロジックに基づいてフィルターを適用できるようにしたいと思います。

たとえば、csv 列の 1 つが特定の値と一致する場合にのみ、イベントをディスクに記録するようにします。

csvパーサードキュメンテーションこれは可能であるはずだということを示唆しているようです。

私の設定は次のようになります:

parser p_my_app {
    csv-parser(
        columns("MY_APP.COLOUR","MY_APP.SIZE","MY_APP.SERIAL_NUMBER")
        delimiters(",")
        flags(escape-double-char)
    );
};

source s_my_app {
    syslog(ip(0.0.0.0) port(6514)
        transport("tcp")
    );
}; 

filter f_my_app { 
    match("123456" value("MY_APP.SERIAL_NUMBER") );
};

destination d_my_app { 
    file("/var/log/my_app.log"
        create_dirs(yes)
    ); 
};

log { 
    source(s_my_app);
    filter(f_my_app);
    parser(p_my_app);
    destination(d_my_app); 
};

しかし、いくら試しても一致しないようです。以下は、その設定での sylog-ng デバッグ出力です。

Incoming log entry; line='<14>1 2017-01-18T17:46:38+11:00 hostname  - - - red,large,123456
'
Filter rule evaluation begins; rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'
Filter node evaluation result; result='not-match'
Filter rule evaluation result; result='not-match', rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'

私は何か非常に明白なことを見逃している(と願っている)のですが、何時間も Google 検索しても完全な例がオンラインで見つかりません。まったく機能しない抜粋だけが表示されます。私が何を間違っているのか、または完全に機能する例を提供できる人はいますか?

答え1

まあ、いつものことのようですが、私は問題に1週間費やし、諦めて、助けを求めることに決め、そして1時間後には自分で解決策を見つけ出します。

私の問題は、声明文の項目の順序でしたlog()。具体的にはparser()しなければならない声明の前にあるfilter()

確かに、ドキュメンテーション(私は10回読んだが見逃したに違いない)には次のように書かれている。

注記 ログ ステートメント内のフィルター、書き換えルール、パーサーは順番に処理されるため、順序は重要です。

したがって、動作するコードは次のようになります。

log { 
    source(s_my_app);
    parser(p_my_app);
    filter(f_my_app);
    destination(d_my_app); 
};

また、もう 1 つ注意すべき点は、match()実際には正規表現であるはずなので、わかりやすくするために、フィルターを次のように更新したことです。

filter f_my_app { 
    match("123456" value("MY_APP.SERIAL_NUMBER") type("string"));
};

syslog-ng では現在次のレポートが出力されています:

Incoming log entry; line='<14>1 2017-01-18T17:46:38+11:00 hostname  - - - red,large,123456
'
Message parsing complete; result='1', rule='p_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:14:2'
Filter rule evaluation begins; rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'
Filter node evaluation result; result='match'
Filter rule evaluation result; result='match', rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'

関連情報