2017-05-03 19 views
0

私はlogstashを使い始めていますが、私のアプリケーションには次の種類のログがあります。ここでは5つの行が続き、異なる関連するものについて収集された統計が示されています。logstashにgrokパターンを書くには

これらは基本的にアプリケーションの統計情報で、各行はリソースの約1つを示しています。

適切に解析する方法はありますか。これは、弾性検索に使用できるようにlogstashを使用していますか?

[20170502 01:57:26.209 EDT (thread-name) package-name.classname#MethodName INFO] Some info line (5 stats): 
[fieldA: strvalue1| field2: 0 | field3: 0 | field4: 0 | field5: 0 | field6: 0 | field7: 0] 
[fieldA: strvalue2| field2: 0 | field3: 0 | field4: 0 | field5: 0 | field6: 0 | field7: 0] 
[fieldA: strvalue3| field2: 0 | field3: 0 | field4: 0 | field5: 0 | field6: 0 | field7: 0] 
[fieldA: strvalue4| field2: 0 | field3: 0 | field4: 0 | field5: 0 | field6: 0 | field7: 0] 
[fieldA: strvalue5| field2: 0 | field3: 0 | field4: 0 | field5: 0 | field6: 0 | field7: 0] 

EDIT

これは、私は統計のこの最初のセットで、使用していて、設定が正しく解析されたが、そのパイプラインの後に動けなくなっているです。そのようなログは150個あることに注意してください。しかし、2〜3だけ保つとうまくいきます。ここで問題を特定するのを手伝ってもらえますか?

# [20170513 06:08:29.734 EDT (StatsCollector-1) deshaw.tools.jms.ActiveMQLoggingPlugin$ActiveMQDestinationStatsCollector#logPerDestinationStats INFO] ActiveMQ Destination Stats (97 destinations): 
# [destName: topic://darts.metaDataChangeTopic | enqueueCount: 1 | dequeueCount: 1 | dispatchCount: 1 | expiredCount: 0 | inflightCount: 0 | msgsHeld: 0 | msgsCached: 0 | memoryPercentUsage: 0 | memoryUsage: 0 | memoryLimit: 536870912 | avgEnqueueTimeMs: 0.0 | maxEnqueueTimeMs: 0 | minEnqueueTimeMs: 0 | currentConsumers: 1 | currentProducers: 0 | blockedSendsCount: 0 | blockedSendsTimeMs: 0 | minMsgSize: 2392 | maxMsgSize: 2392 | avgMsgSize: 2392.0 | totalMsgSize: 2392] 

input { 
    file { 
    path => "/u/bansalp/activemq_primary_plugin.stats.log.1" 
### For testing and continual process of the same file, remove these before produciton 
    start_position => "beginning" 
    sincedb_path => "/dev/null" 
### Lets read the logfile and recombine multi line details 
    codec => multiline { 
     # Grok pattern names are valid! :) 
     pattern => "^\[destName:" 
     negate => false 
     what => "previous" 
    } 
    } 
} 

filter { 
    if ([message] =~ /^\s*$/){ 
     drop{} 
    } 
    if ([message] =~ /^[^\[]/) { 
      drop{} 
    } 

    if ([message] =~ /logMemoryInfo|logProcessInfo|logSystemInfo|logThreadBreakdown|logBrokerStats/) { 
      drop{} 
    } 
    if [message] =~ "logPerDestinationStats" { 
     grok { 
       match => { "message" => "^\[%{YEAR:yr}%{MONTHNUM:mnt}%{MONTHDAY:daynum}\s*%{TIME:time}\s*%{TZ:timezone}\s*(%{DATA:thread_name})\s*%{JAVACLASS:javaclass}#%{WORD:method}\s*%{LOGLEVEL}\]\s*" 
       } 
     } 
     split { 
      field => "message" 
     } 
     grok { 
       match => { "message" => "^\[%{DATA}:\s*%{DATA:destName}\s*\|\s*%{DATA}:\s*%{NUMBER:enqueueCount}\s*\|\s*%{DATA}:\s*%{NUMBER:dequeueCount}\s*\|\s*%{DATA}:\s*%{NUMBER:dispatchCount}\s*\|\s*%{DATA}:\s*%{NUMBER:expiredCount}\s*\|\s*%{DATA}:\s*%{NUMBER:inflightCount}\s*\|\s*%{DATA}:\s*%{NUMBER:msgsHeld}\s*\|\s*%{DATA}:\s*%{NUMBER:msgsCached}\s*\|\s*%{DATA}:\s*%{NUMBER:memoryPercentUsage}\s*\|\s*%{DATA}:\s*%{NUMBER:memoryUsage}\s*\|\s*%{DATA}:\s*%{NUMBER:memoryLimit}\s*\|\s*%{DATA}:\s*%{NUMBER:avgEnqueueTimeMs}\s*\|\s*%{DATA}:\s*%{NUMBER:maxEnqueueTimeMs}\s*\|\s*%{DATA}:\s*%{NUMBER:minEnqueueTimeMs}\s*\|\s*%{DATA}:\s*%{NUMBER:currentConsumers}\s*\|\s*%{DATA}:\s*%{NUMBER:currentProducers}\s*\|\s*%{DATA}:\s*%{NUMBER:blockedSendsCount}\s*\|\s*%{DATA}:\s*%{NUMBER:blockedSendsTimeMs}\s*\|\s*%{DATA}:\s*%{NUMBER:minMsgSize}\s*\|\s*%{DATA}:\s*%{NUMBER:maxMsgSize}\s*\|\s*%{DATA}:\s*%{NUMBER:avgMsgSize}\s*\|\s*%{DATA}:\s*%{NUMBER:totalMsgSize}\]$" } 
     } 
     mutate { 
      convert => { "message" => "string" } 
      add_field => { 
       "session_timestamp" => "%{yr}-%{mnt}-%{daynum} %{time} %{timezone}" 
       "load_timestamp" => "%{@timestamp}" 
      } 
      remove_field => ["yr","mnt", "daynum", "time", "timezone"] 
     } 
    } 
} 
output { 
    stdout {codec => rubydebug} 
} 

答えて

1

もちろんあります。

入力フィルターにmultiline codecを使用する必要があります。例1として

input { 
    file { 
    path => "/var/log/someapp.log" 
    codec => multiline { 
     # Grok pattern names are valid! :) 
     pattern => "^\[%{YEAR}%{MONTHNUM}%{MONTHDAY}\s*%{TIME}" 
     negate => true 
     what => previous 
    } 
    } 
} 

この基本的YYYYMMDD HHで始まるdoes notのいずれかの行があることを述べて:MI:ss.000は

今あなたがすることができます。そこから前の行にマージします最初の行にGrokパターンを適用します(高レベルのデータを取得するため)。

最初の行から必要なデータをすべて取得できたら、\ rまたは\ nに分割して、単一のgrokパターンを使用して個々の統計データを取得することができます(上記の例に基づいて) 。これは

D

アップデート2017年5月8日11:54助け

希望:

を完全logstash confには、おそらくこのようになります

、あなたはGROKパターンの変更を検討する必要があります。あなたの要求に一層合うように(あなただけがあなたのデータを知っています)。

注:これはテストされていません。私はあなたに任せます。

input { 
    file { 
    path => "/var/log/someapp.log" 
### For testing and continual process of the same file, remove these before produciton 
    start_position => "beginning" 
    sincedb_path => "/dev/null" 
### Lets read the logfile and recombine multi line details 
    codec => multiline { 
     # Grok pattern names are valid! :) 
     pattern => "^\[%{YEAR}%{MONTHNUM}%{MONTHDAY}\s*%{TIME}" 
     negate => true 
     what => previous 
    } 
    } 
} 
filter { 
### Let's get some high level data before we split the line (note: anything you grab before the split gets copied) 
    grok { 
     match => { "message" => "^\[%{YEAR:yr}%{MONTHNUM:mnt}%{MONTHDAY:daynum}\s*%{TIME:time}\s*%{TZ:timezone}\s*(%{DATA:thread_name})\s*%{JAVACLASS:javaclass}#%{WORD:method}\s*%{LOGLEVEL}\]" 
     } 
    } 
### Split the lines back out to being a single line now. (this may be a \r or \n, test which one) 
    split { 
     "field" => "message" 
     "terminator" => "\r" 
    } 
### Ok, the lines should now be independent, lets add another grok here to get the patterns as dictated by your example [fieldA: str | field2: 0...] etc. 
### Note: you should look to change the grok pattern to better suit your requirements, I used DATA here to quickly capture your content 
    grok { 
     break_on_match => false 
     match => { "message" => "^\[%{DATA}:\s*%{DATA:fieldA}\|%{DATA}:\s*%{DATA:field2}\|%{DATA}:\s*%{DATA:field3}\|%{DATA}:\s*%{DATA:field4}\|%{DATA}:\s*%{DATA:field5}\|%{DATA}:\s*%{DATA:field6}\|%{DATA}:\s*%{DATA:field7}\]$" } 
    } 
    mutate { 
    convert => { "message" => "string" } 
     add_field => { 
      "session_timestamp" => "%{yr}-%{mnt}-%{daynum} %{time} %{timezone}" 
      "load_timestamp" => "%{@timestamp}" 
     } 
     remove_field => ["yr","mnt", "daynum", "time", "timezone"] 
    } 
} 
output { 
    stdout { codec => rubydebug } 
} 

EDIT 2017年5月15日

Logstash複雑なパーサである、それは

(あなたがそれをクラッシュさせる必要があり、なぜそれゆえ)プロセスとしてまで滞在し、継続的にログファイルを監視することを期待

ブレイクマッチでは、同じ行に複数の一致条件がある可能性があります。一致するものが見つからなかった場合は、リスト内の次の項目を試します(常に複雑になります)。

入力フィルタ終わるパス。log *また、元の例によると、必要な日付形式にパターンを一致させる必要はありません(すべての関連付けを1行にするため)。

フィルタは分割文字を指定する必要があります私は信じている(そうでなければ、デフォルトはカンマ)。

input { 
    file { 
    path => "/u/bansalp/activemq_primary_plugin.stats.log*" 
### For testing and continual process of the same file, remove these before production 
    start_position => "beginning" 
    sincedb_path => "/dev/null" 
### Lets read the logfile and recombine multi line details 
    codec => multiline { 
     # Grok pattern names are valid! :) 
     pattern => "^\[destName:" 
     negate => false 
     what => "previous" 
    } 
    } 
} 

filter { 
    if "logPerDestinationStats" in [message] { 
     grok { 
       match => { "message" => "^\[%{YEAR:yr}%{MONTHNUM:mnt}%{MONTHDAY:daynum}\s*%{TIME:time}\s*%{TZ:timezone}\s*(%{DATA:thread_name})\s*%{JAVACLASS:javaclass}#%{WORD:method}\s*%{LOGLEVEL}\]\s*" 
       } 
     } 
     split { 
      field => "message" 
      terminator => "\r” 
      } 
     grok { 
       match => { "message" => "^\[%{DATA}:\s*%{DATA:destName}\s*\|\s*%{DATA}:\s*%{NUMBER:enqueueCount}\s*\|\s*%{DATA}:\s*%{NUMBER:dequeueCount}\s*\|\s*%{DATA}:\s*%{NUMBER:dispatchCount}\s*\|\s*%{DATA}:\s*%{NUMBER:expiredCount}\s*\|\s*%{DATA}:\s*%{NUMBER:inflightCount}\s*\|\s*%{DATA}:\s*%{NUMBER:msgsHeld}\s*\|\s*%{DATA}:\s*%{NUMBER:msgsCached}\s*\|\s*%{DATA}:\s*%{NUMBER:memoryPercentUsage}\s*\|\s*%{DATA}:\s*%{NUMBER:memoryUsage}\s*\|\s*%{DATA}:\s*%{NUMBER:memoryLimit}\s*\|\s*%{DATA}:\s*%{NUMBER:avgEnqueueTimeMs}\s*\|\s*%{DATA}:\s*%{NUMBER:maxEnqueueTimeMs}\s*\|\s*%{DATA}:\s*%{NUMBER:minEnqueueTimeMs}\s*\|\s*%{DATA}:\s*%{NUMBER:currentConsumers}\s*\|\s*%{DATA}:\s*%{NUMBER:currentProducers}\s*\|\s*%{DATA}:\s*%{NUMBER:blockedSendsCount}\s*\|\s*%{DATA}:\s*%{NUMBER:blockedSendsTimeMs}\s*\|\s*%{DATA}:\s*%{NUMBER:minMsgSize}\s*\|\s*%{DATA}:\s*%{NUMBER:maxMsgSize}\s*\|\s*%{DATA}:\s*%{NUMBER:avgMsgSize}\s*\|\s*%{DATA}:\s*%{NUMBER:totalMsgSize}\]$" } 
     } 
     mutate { 
      convert => { "message" => "string" } 
      add_field => { 
       "session_timestamp" => "%{yr}-%{mnt}-%{daynum} %{time} %{timezone}" 
       "load_timestamp" => "%{@timestamp}" 
      } 
      remove_field => ["yr","mnt", "daynum", "time", "timezone"] 
     } 
    } 
    else { 
     drop{} 
    } 
} 

私は現在、携帯電話からこれを更新しています書式設定を言い訳してください、私は私の代わりに書式設定を更新するために誰かのために満足しています。

+0

ありがとうございます。私は、あなたが "最初の行にGrokパターンを適用できるようになった"と言いました。私はそれをどうやって行いますか、パターンはパターンを指定して様々なフィールドを抽出するものではありませんか? – learner

+0

あなたが今必要とするのは、フィルタープラグインを組み込むことです(標準のlogstashファイルには入力プラグインと出力プラグインがあります)。フィルタープラグインセクションに複数のフィルター、grok、mutate、xml、json、rubyなどを適用できます。 grokのヘルプについては、http://grokdebug.herokuapp.com/ –

+0

をチェックしてください。私のファイルのサイズは50 MBで、Logstashは解析に時間がかかります。私は同じログファイルが異なるフィールドを持つ統計ログの3-4種類を持っているので、私は別のログ行のための異なるgrkパターンに一致する文を使用しています。 – learner

関連する問題