2017-09-11 39 views
1

我已經配置logstash管道來報告彈性。我能夠讀取日誌文件。我的日誌文件中包含多行的消息,但每條線被報告爲一個消息elastic.Following是我logstash配置文件logstash多行編解碼器不起作用

LogConf文件:

input { 
     file { 
      path => ["abc.log" ] 
      start_position => "beginning" 
      codec => multiline 
      { 
       pattern => "^%{LOGLEVEL}" 
       negate => "false" 
       what => "next" 
      } 
     } 
    } 
    filter { 

    } 
    output { 
     # only for debug purposes 
     stdout { 
      codec => rubydebug 
     } 
     elasticsearch { 
      hosts => ["http://abcd:9200"] 
      index => "logstash" 
     } 
    } 

日誌文件:

DEBUG - LogBO={ 
    message:############ ############## 
------------>>!User Info[################################] 
------------>>!Debug Info[ ############################# ] 
***************isABCEnabled*********************true 
} 
DEBUG - LogBO={ 
    message:############ ############## 
------------>>!User Info[################################] 
------------>>!Debug Info[ ############################# ] 
***************isABCEnabled*********************true 
} 

我我能夠看到日誌報告給Elastic,但是每行日誌都是一個單獨的消息。我想整個日誌

DEBUG - LogBO={ 
    message:############ ############## 
------------>>!User Info[################################] 
------------>>!Debug Info[ ############################# ] 
***************isABCEnabled*********************true 
} 

作爲單個消息報告給Elastic.Please幫我解決這個問題。

請幫我解決這個問題。

回答

1

通過使用

codec => multiline { 
    pattern => "^%{LOGLEVEL}" 
    negate => "false" 
    what => "next" 
} 

你告訴編解碼器加入任何線路匹配^%{LOGLEVEL}與下一行加入。這將加入第一行到第二行,因爲第一行匹配^%{LOGLEVEL}。其他行將被忽略,並且模式將不會繼續匹配並將相同的行連接在一起。因此,最終會出現一些部分日誌事件。

你將要使用

codec => multiline { 
    pattern => "^%{LOGLEVEL}" 
    negate => "true" 
    what => "previous" 
} 

代替。這告訴logstash將任何不符合^%{LOGLEVEL}的行添加到上一行。這確保了事件始終以^%{LOGLEVEL}匹配線開始,並且是您想要的。

+0

非常感謝!根據您的建議嘗試,但這導致報告完整的日誌文件到彈性。請幫幫我。 –

+0

那麼它將它們連接在一起?這意味着模式不匹配,因爲每次模式匹配時都會創建新事件。在行開始和日誌級別之間是否有前導空格,或者日誌和模式之間是否有其他細微的差異。 –

+0

準確!這是空間問題。更正後,其按預期工作。 –