2016-09-19 2 views
0

I以下のフィルタを持ってLogstash:変異させるフィルターが動作しません

filter { 
    grok { 
    break_on_match => false 
     match => { 'message' => '\[(?<log_time>\d{0,2}\/\d{0,2}\/\d{2} \d{2}:\d{2}:\d{2}:\d{3} [A-Z]{3})\]%{SPACE}%{BASE16NUM}%{SPACE}%{WORD:system_stat}%{GREEDYDATA}\]%{SPACE}%{LOGLEVEL}%{SPACE}(?<log_method>[a-zA-Z\.]+)%{SPACE}-%{SPACE}%{GREEDYDATA:log_message}%{SPACE}@%{SPACE}%{IP:app_host}:%{INT:app_port};%{SPACE}%{GREEDYDATA}Host:%{IPORHOST:host_name}:%{POSINT:host_port}' } 
    match => { 'message' => '\[(?<log_time>\d{0,2}\/\d{0,2}\/\d{2} \d{2}:\d{2}:\d{2}:\d{3} [A-Z]{3})\]'} 
    } 
    kv{ 
     field_split => "\n;" 
     value_split => "=:" 
     trimkey => "<>\[\],;\n" 
     trim => "<>\[\],;\n" 
    } 
    date{ 
    match => [ "log_time","MM/dd/YY HH:mm:ss:SSS z" ] 
    target => "log_time" 
    locale => "en" 
    } 

    mutate { 

     convert => { 
       "line_number" => "integer" 
       "app_port" => "integer" 
       "host_port" => "integer" 
       "et" => "integer" 

     } 

     #remove_field => [ "message" ] 

    } 

    mutate { 

    rename => { 

       "et" => "execution_time" 
       "URI" => "uri" 
       "Method" => "method" 

     } 
    } 

} 

私はGROKとKVフィルタの外に結果を得ることができますが、フィルターのmutate作業のどちらも。それはkvフィルタのためですか?

EDIT:目的

私の問題は私のログが不均一なログレコードが含まれていることです。例えば

[9/13/16 15:01:18:301 EDT] 89798797 SystemErr              jbhsdbhbdv [vjnwnvurnuvuv] INFO djsbbdyebycbe - Filter.doFilter(..) took 0 ms. 

[9/13/16 15:01:18:302 EDT] 4353453443 SystemErr             sdgegrebrb [dbebtrntn] INFO sverbrebtnnrb - [SECURITY AUDIT] Received request from: "null" @ wrvrbtbtbtf:000222; Headers=Host:vervreertherg:1111 
Connection:keep-alive 
User-Agent:Mozilla/5.0 
Accept:text/css,*/*;q=0.1 
Referer:https:kokokfuwnvuwnev/ikvdwninirnv/inwengi 
Accept-Encoding:gzip 
Accept-Language:en-US,en;q=0.8 
; Body=; Method=GET; URI=dasd/wgomnwiregnm/iwenviewn; et=10ms; SC=200 

私は、彼らが存在する場合、各レコードおよびその他のいくつかのフィールドの先頭にタイムスタンプを取得している気にすべて。私はほしいMethodetHostloglevelおよびURIです。これらのフィールドが存在しない場合、私はまだloglevelmessageが記録されたイベントをキャプチャします。

このようなイベントを同じlogstashプロセスでキャプチャすることをお勧めしますか?私は2つのlogstashプロセスを実行する必要がありますか?問題は、私がキャプチャしたいいくつかのフィールドを除いて、事前にログの構造を知っていないことです。

複数行の設定

path => ["path to log"] 
start_position => "beginning" 
ignore_older => 0 
sincedb_path => "/dev/null" 
codec => multiline { 
pattern => "^\[\d{0,2}\/\d{0,2}\/\d{2} \d{2}:\d{2}:\d{2}:\d{3} [A-Z]{3}\]" 
negate => "true" 
what => "previous" 
+0

ログラインと予想される出力を追加できれば、人々があなたの問題を理解するのに役立ちます。それはあなたの問題が何であるか分かりません。 – baudsp

答えて

1

いくつかのフィールド(LINE_NUMBER、ら、URI、メソッド)が初期GROK中に作成されていないので、多分それはあります。例えば、私はあなたが "log_method"を定義するのを見ますが、mutate-> renameでは "Method"を参照します。これらの追加フィールドを追加する入力ブロックにjsonコーデックなどが適用されていますか?

サンプルログを投稿する場合は、フィルタを使用してそのログをテストし、さらに役立てることができます。 :)

EDIT: 送信したログに複数の行があります。入力時に複数行のフィルターを使用していますか?入力ブロックも共有できますか?

2つのLogstashプロセスを実行する必要はありません。 1つのLogstashは複数のログ形式を処理できます。条件文を使うか、try/catchするか、オプションとして '?'を付けてフィールドに印を付けることができます。後に。

MORE EDIT:私はtrimkey => "<>\[\],;()?\n"trimkey => "<>\[\],;\n"を変更したら

"execution_time" => 10, 
"uri" => "dasd/wgomnwiregnm/iwenviewn", 
"method" => "GET" 

: 私はあなたのmutateフィルタが動作することを意味し、出力を取得しています。私は、これらのフィールド(et、Method)の前にスペースがあることに気づいた。

注:私はテストに次のマルチラインフィルターを使用しています。もしあなたの結果が異なる場合は結果に影響します。それが役に立ったら教えてください。

codec => multiline { 
    pattern => "\n" 
    negate => true 
    what => previous 
} 
+0

ありがとう、log_methodとMethodは2つの別々のフィールドです。私は詳細を質問に更新する – AbtPst

+0

編集した説明を参照してください – AbtPst

+1

私のコメントも編集! – fylie

関連する問題