【问题标题】:How to split message into multiple fields logstash如何将消息拆分为多个字段logstash
【发布时间】:2017-11-07 01:06:57
【问题描述】:

我想将具有完整日志行的字段拆分为多个字段(而不是一个字段)。现在日志值与管道分开,并且想知道是否有办法做到这一点。提前致谢。

日志行示例:

INFO |2017-12-06T15:00:00,344|532fdcaa-ca27-4b38-8d6b-408bd72e94f2|qk29fnkgsye45d33hxsuctdu:AMOMA|ApiAvailabilityRQ|0||20171208|20171111|1~2~0|HTL:true,COMPANYNAME>121704;PAY:AT_WEB|ADC68E2C0F1D4FF08F6D6DBCCCB227011600|1|4

我的想法:

grok {
    match => [ "message", "^(?m)%{WORD:level}\s?\|%{TIMESTAMP_ISO8601:timestamp}\|(?<echoToken>([^|]*))\|(?<apiKey>(\w*))(\:(?<ttoo>([\w ]*)))?\|%{WORD:operation}\|%{NUMBER:processTime}\|((?<exceptionType>[^|\:]+)(\:(?<exceptionDetail>[^|#]+)(###(?<exceptionMessage>[^|]+))?)?)?\|(((?<checkin>(\d+))\|(?<checkout>(\d+))\|(?<occupancy>([\d~#]+))\|((?:HTL:)(?<hotels_included(true|false)),(?:HOTELBEDS|GIATA)\->(?<hotels>([\d|,]+))|(?:DST:(?<destination>(\w+))(\w*))(;ZON:(?<zone>(\d+)))?|(GEO:(?<geo>([^;]*))))(;(?<filters>[^|]+))?\|(?<cacheKey>(\w+))?\|(?<num_hotels>(\d+))\|(?<num_ratekeys>(\d+))(\|(?<slow>(SLOW)))?)|((?<bookingDetail>(\d+-\d+))(\|(?<checkin>(\d+))\|(?<checkout>(\d+))\|(?<hotel>(\d+))\|(?<destination>(\w+))\|(?<zone>(\d+))\|(?<amount>([\d\.]+))\|%{GREEDYDATA:rateKey})?)|%{GREEDYDATA:logMessage})" ]
}

【问题讨论】:

  • 也许你可以添加一个你想要解析的日志和你想要检索的字段的例子。
  • 当然。完成了:)
  • 好吧,grok 模式的结尾是完全错误的,从((?&lt;checkin&gt;(\d+)) 开始。将正则表达式拆分为多个模式应该更容易,而不是将所有内容都放在同一个正则表达式中。

标签: elasticsearch logstash


【解决方案1】:

这种模式成功地抓取了由管道分隔的值。

^(?m)%{WORD:level}\s?\|%{TIMESTAMP_ISO8601:timestamp}\|(?<echoToken>([^|]*))\|(?<apiKey>(\w*))(\:(?<ttoo>([\w ]*)))?\|%{WORD:operation}\|%{NUMBER:processTime}\|((?<exceptionType>[^|\:]+)(\:(?<exceptionDetail>[^|#]+)(###(?<exceptionMessage>[^|]+))?)?)?\|%{NUMBER:A}\|%{NUMBER:B}\|%{DATA:C}\|%{DATA:D}\|%{DATA:E}\|%{NUMBER:F}\|%{NUMBER:G}

开头基于问题中提供的内容,结尾是为了抓取管道之间的内容。

【讨论】:

    猜你喜欢
    • 2016-07-25
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多