使用\ r \ n作为字段拆分(反斜杠)

时间:2016-01-15 18:35:21

标签: regex logstash 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并得到了同样的问题。

有什么建议吗?

非常感谢

2 个答案:

答案 0 :(得分:1)

有几个问题:

  1. Logstash发货人正在插入另一个反斜杠,因此当事件被logstash中心引用时,正则表达式不匹配
  2. kv过滤器中的field_split接受一串字符,如果其中一个字符匹配,则该字段被拆分,因此问题变成:我们在HTTP标头中找不到的字符是什么?没有人。
  3. 我找到的解决方案是使用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"
        }
      }
    }
    

    希望有所帮助

答案 1 :(得分:1)

在这种情况下,应使用field_split_pattern而不是field_split。区别在于field_split构成一个正则表达式字符类(单字符字段定界符),而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 => ": "
  }
}