\r\n 作为字段拆分(反斜杠)的 Logstash kv 过滤器问题
Logstash kv filter issue with \r\n as field split (backslash)
我正在尝试使用 kv
解析此日志行
Host: mobile.bpifrance.fr\r\nConnection: keep-alive\r\nAccept: application/json, text/plain, */*\r\nUser-Agent: Mozilla/5.0 (Linux; Android 5.0.2; SM-G901F Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Crosswalk/IP.IP.IP.IP Mobile Safari/537.36\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: fr-fr\r\nCookie: MRHSHint=deleted; XXXX=1z1z1z1452251835z14400; LastMRH_Session=0175d881; JSESSIONID=836A243928E475506091D32FB585D812; TDF=123456.789.1000; TDF=123456.789.1000; TS01748689=01450ecb576c294567faa529b12c3299cf27b272dc5d54fe2c1f98fca83fc436733ad811cd33162b0ce794a6658d86242d07407c8a\r\nX-Forwarded-For: IP.IP.IP.IP\r\nX-Forwarded-Remote-User: xxxx\r\nsession-id: 0175d881\r\nsession-key: 6ab68177c496ec366d5c45240175d881\r\nusername: xxxx\r\n\r\n
我用 kv 尝试了几种配置,但总是出现奇怪的行为。
对我来说最合乎逻辑的配置是做这样的事情:
field_split => "(\\r\\n)"
我用 (\\\\\r\\\\\n)
、(\\)r(\\)n
、(?\\)r{1}(?\\)n{1}
试过 field_split,但没有结果。
我也尝试过 mutate gsub 并遇到了同样的问题。
有什么建议吗?
非常感谢
有几个问题:
- Logstash shipper 插入了另一个反斜杠,所以当 logstash central 处理事件时,正则表达式不匹配
- kv 过滤器中的 field_split 接受一串字符,如果其中一个字符匹配,则该字段被拆分,所以问题就变成了:我们在 HTTP 中找不到的字符是什么 headers?没有人。
我找到的解决方案是使用 mutate gsub 将 \r\n
替换为一些字符串,然后通过插入一个真正的换行符(通过使用 ruby 过滤器和不是拆分过滤器)当匹配此字符串并最终将 kv 过滤器与 \n
:
一起使用时
filter {
mutate {
gsub => [ "message", "[\\]r", "somestring" ]
gsub => [ "message", "[\\]n", "somestring" ]
}
}
filter {
ruby {
code => "begin; event['message'] = event['message'].split(/somestringsomestring/); rescue Exception; end"
}
}
filter {
if [type] == "XXX" {
kv {
field_split => "\n"
value_split => ":"
source => "message"
}
}
}
希望对您有所帮助
在您的情况下,您应该使用 field_split_pattern
而不是 field_split
。不同之处在于 field_split
形成正则表达式字符 class(单字符字段分隔符),而 field_split_pattern
是正确的正则表达式。
有关详细信息,请参阅 https://www.elastic.co/guide/en/logstash/current/plugins-filters-kv.html。
试试这个配置:
filter {
kv {
source => "message"
field_split_pattern => "\r\n"
value_split_pattern => ": "
}
}
我正在尝试使用 kv
解析此日志行Host: mobile.bpifrance.fr\r\nConnection: keep-alive\r\nAccept: application/json, text/plain, */*\r\nUser-Agent: Mozilla/5.0 (Linux; Android 5.0.2; SM-G901F Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Crosswalk/IP.IP.IP.IP Mobile Safari/537.36\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: fr-fr\r\nCookie: MRHSHint=deleted; XXXX=1z1z1z1452251835z14400; LastMRH_Session=0175d881; JSESSIONID=836A243928E475506091D32FB585D812; TDF=123456.789.1000; TDF=123456.789.1000; TS01748689=01450ecb576c294567faa529b12c3299cf27b272dc5d54fe2c1f98fca83fc436733ad811cd33162b0ce794a6658d86242d07407c8a\r\nX-Forwarded-For: IP.IP.IP.IP\r\nX-Forwarded-Remote-User: xxxx\r\nsession-id: 0175d881\r\nsession-key: 6ab68177c496ec366d5c45240175d881\r\nusername: xxxx\r\n\r\n
我用 kv 尝试了几种配置,但总是出现奇怪的行为。
对我来说最合乎逻辑的配置是做这样的事情:
field_split => "(\\r\\n)"
我用 (\\\\\r\\\\\n)
、(\\)r(\\)n
、(?\\)r{1}(?\\)n{1}
试过 field_split,但没有结果。
我也尝试过 mutate gsub 并遇到了同样的问题。
有什么建议吗?
非常感谢
有几个问题:
- Logstash shipper 插入了另一个反斜杠,所以当 logstash central 处理事件时,正则表达式不匹配
- kv 过滤器中的 field_split 接受一串字符,如果其中一个字符匹配,则该字段被拆分,所以问题就变成了:我们在 HTTP 中找不到的字符是什么 headers?没有人。
我找到的解决方案是使用 mutate gsub 将 \r\n
替换为一些字符串,然后通过插入一个真正的换行符(通过使用 ruby 过滤器和不是拆分过滤器)当匹配此字符串并最终将 kv 过滤器与 \n
:
filter {
mutate {
gsub => [ "message", "[\\]r", "somestring" ]
gsub => [ "message", "[\\]n", "somestring" ]
}
}
filter {
ruby {
code => "begin; event['message'] = event['message'].split(/somestringsomestring/); rescue Exception; end"
}
}
filter {
if [type] == "XXX" {
kv {
field_split => "\n"
value_split => ":"
source => "message"
}
}
}
希望对您有所帮助
在您的情况下,您应该使用 field_split_pattern
而不是 field_split
。不同之处在于 field_split
形成正则表达式字符 class(单字符字段分隔符),而 field_split_pattern
是正确的正则表达式。
有关详细信息,请参阅 https://www.elastic.co/guide/en/logstash/current/plugins-filters-kv.html。
试试这个配置:
filter {
kv {
source => "message"
field_split_pattern => "\r\n"
value_split_pattern => ": "
}
}