【发布时间】: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 模式的结尾是完全错误的,从
((?<checkin>(\d+))开始。将正则表达式拆分为多个模式应该更容易,而不是将所有内容都放在同一个正则表达式中。