2016-06-08 78 views
1

我已经在logstash中写入了一个conf文件来读取jms日志,问题是我无法将记录拆分成新行前过滤。这里是原始数据Logstash读取新行问题

####<Sep 20, 2015 12:00:12 AM> <> <1442678412960> <809000> <ID:<307061.1442678412716.0>> <> <[email protected]_audit_als_dQue> <Consumed> <<anonymous>> <MC:CA(local):OAMI(CmsCorpAlsPrd_cdceap7e_32040.jms.connection36.session121.consumer125)> <&lt;?xml version="1.0" encoding="UTF-8"?&gt; 
&lt;mes:WLJMSMessage xmlns:mes="http://www.bea.com/WLS/JMS/Message"&gt;&lt;mes:Header&gt;&lt;mes:JMSDeliveryMode&gt;PERSISTENT&lt;/mes:JMSDeliveryMode&gt;&lt;mes:JMSExpiration&gt;0&lt;> <> ####<Sep 20, 2015 12:00:13 AM> <> <1442678413018> <392000> <ID:<307061.1442678412943.0>> <> <[email protected]_audit_als_dQue> <Produced> <<anonymous>> <> <&lt;?xml version="1.0" encoding="UTF-8"?&gt; 
&lt;mes:WLJMSMessage xmlns:mes="http://www.bea.com/WLS/JMS/Message"&gt;&lt;mes:Header&gt;&lt;mes:JMSDeliveryMode&gt;PERSISTENT&lt;/mes:JMSDeliveryMode&gt;&lt;mes:JMSExpiration&gt;0&lt;> <> 

,这里是在logstash我的conf文件

input{ 
    stdin{} 
    file{ 
     type => "txt" 
     path => "C:\HA\jms\jms.log" 
     start_position => "beginning" 
    } 
} 
filter{ 
    multiline{ 
     pattern => "\&" 
     what => previous 
    } 
    grok{ 
    match => {"message" => ['####<%{GREEDYDATA:Date}>%{SPACE}<>%{SPACE}<%{GREEDYDATA:Millisec_Date}>%{SPACE}<%{GREEDYDATA:Nanosec_Date}>%{SPACE}<ID:<%{GREEDYDATA:JMS_message_ID}>>%{SPACE}<>%{SPACE}<%{GREEDYDATA:JMS_destination_name}>%{SPACE}<%{GREEDYDATA:JMS_message_eventname}>%{SPACE}<<%{GREEDYDATA:JMS_username}>>%{SPACE}<%{GREEDYDATA:JMS_correlationID}>%{SPACE}<%{GREEDYDATA:Mcls}:JMSDeliveryMode&gt;%{WORD:JMSDeliveryMode}&lt;/mes:JMSDeliveryMode&gt;&lt;mes:JMSExpiration&gt;%{NUMBER:JMSExpiration}&lt;>%{SPACE}<>']} 
     } 
} 
output{ 
    elasticsearch { hosts => ["localhost:9200"] 
    } 
    stdout { codec => rubydebug } 
} 

所有的事情都很顺利,当我运行的conf除,结果给了我这个

    "@version" => "1", 
       "@timestamp" => "2016-06-08T06:23:50.543Z", 
        "path" => "C:\\HA\\jms\\jms.log", 
        "host" => "WIN-07LLQEN2SJB", 
        "type" => "txt", 
        "tags" => [ 
     [0] "multiline" 
    ], 
        "Date" => "Sep 20, 2015 12:00:12 AM> <> <1442678412960> <809000> <ID:<307061.1 
442678412716.0>> <> <[email protected]_audit_als_dQue> <Consumed> <<anonymou 
s>> <MC:CA(local):OAMI(CmsCorpAlsPrd_cdceap7e_32040.jms.connection36.session121.consumer125)> <&lt;?xml version=\"1.0\" 
encoding=\"UTF-8\"?&gt;\n&lt;mes:WLJMSMessage xmlns:mes=\"http://www.bea.com/WLS/JMS/Message\"&gt;&lt;mes:Header&gt;&lt; 
mes:JMSDeliveryMode&gt;PERSISTENT&lt;/mes:JMSDeliveryMode&gt;&lt;mes:JMSExpiration&gt;0&lt;> <> \n####< 
Sep 20, 2015 12:00:13 AM", 
      "Millisec_Date" => "1442678413018", 
      "Nanosec_Date" => "392000", 
      "JMS_message_ID" => "307061.1442678412943.0", 
    "JMS_destination_name" => "[email protected]_audit_als_dQue", 
    "JMS_message_eventname" => "Produced", 
      "JMS_username" => "anonymous", 
        "Mcls" => "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;mes:WLJMSMessage xmlns:mes=\"http: 
//www.bea.com/WLS/JMS/Message\"&gt;&lt;mes:Header&gt;&lt;mes", 
      "JMSDeliveryMode" => "PERSISTENT", 
      "JMSExpiration" => "0" 
} 

显然,日期已经有部分已经读取了第一条消息中的所有数据,并且似乎将我分类为第二条消息的数据。无论如何要解决这个在新行中打破不同的记录?我已经配置帮助

回答

0

一段时间后,两件事情:

  1. 不要使用GREEDYDATA匹配的日期。顾名思义它很贪婪。使用更具体的grok表达式。
  2. 更好的多行条件可能是“除非该行以### <与前一行连接开始”。如果你坚持坚持使用你现在的模式,你至少应该在^之前加上^,这样它只能匹配行首的符号。