【问题标题】:What should be the grok pattern for thoses logs ? (ingest pipeline for filebeat)这些日志的 grok 模式应该是什么? (文件节拍的摄取管道)
【发布时间】:2018-11-21 19:36:06
【问题描述】:

我是 elasticsearch 社区的新手,希望您能帮助我解决我正在努力解决的问题。 我的目标是使用 Filebeat 将大量日志文件发送到 Elasticsearch。 为此,我需要使用带有 Grok 模式处理器的摄取节点来解析数据。如果不这样做,我的所有日​​志都不能被利用,因为每个日志都属于同一个“消息”字段。不幸的是,我对 grok 正则表达式有一些问题,我找不到问题,因为这是我第一次使用它。 我的日志是这样的:

2016-09-01T10:58:41+02:00 INFO (6):     165.225.76.76   entreprise1 email1@gmail.com    POST    /application/controller/action  Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko   {"getid":"1"}   86rkt2dqsdze5if1bqldfl1
2016-09-01T10:58:41+02:00 INFO (6):     165.225.76.76   entreprise2 email2@gmail.com    POST    /application/controller/action  Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko   {"getid":"2"}   86rkt2rgdgdfgdfgeqldfl1
2016-09-01T10:58:41+02:00 INFO (6):     165.225.76.76   entreprise3 email3@gmail.com    POST    /application/controller/action  Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko   {"getid":"2"}

所以我们有标签作为分隔符,这些字段: 日期、IP、公司名称、电子邮件、方法(post、get)、url、浏览器、json_request、optional_code

我的摄取管道 json 看起来像这样:

PUT _ingest/pipeline/elastic_log_index

    {
      "description" : "Convert logs txt files",
      "processors" : [
        {
          "grok": {
            "field": "message",
            "patterns": ["%{TIMESTAMP_ISO8601:timestamp} %{IP:ip} %{WORD:company}% {EMAILADDRESS:email} %{URIPROTO:method} %{URIPATH:page} %{WORD:browser} %{WORD:code}"]

          }
        },
        {
          "date" : {
            "field" : "timestamp",
            "formats" : ["yyyy-MM-ddTHH:mm:ss INFO(6):"]
          }
        }
      ],
      "on_failure" : [
        {
          "set" : {
            "field" : "error",
            "value" : " - Error processing message - "
          }
        }
      ]
    }

这不起作用。

1) 如何转义字符?例如时间戳末尾的“INFO(6):”

2) 我可以在我的 gork 模式中使用字段之间的空格吗?文件日志中的分隔符是制表符。

3) 行尾的代码并不总是出现在日志中,这可能是个问题吗?

4) 你知道为什么这个配置在我的 elasticsearch 下的日志文件中无论如何都不能解析吗?

非常感谢您的帮助,请原谅我的英语水平我是法语。

【问题讨论】:

    标签: elasticsearch logstash logstash-grok filebeat


    【解决方案1】:

    您的 grok 模式与日志中的所有内容都不匹配,这就是它不起作用的原因。例如,%{WORD} 将仅匹配 Mozilla,而不匹配 /5.0。您可以创建自定义模式以匹配整个 browser/version,例如 (?<browser>%{WORD}(/%{NUMBER})?)

    您可以通过简单地将INFO (6):.* 匹配来转义它,它将在输出中被忽略。

    就空格而言,请使用预定义的 grok 模式 %{SPACE} 匹配它们。

    最后的代码可以通过创建自定义模式变为可选,即(?<optional_code>%{WORD}?)

    然后你的整个 grok 模式就会变成,

    %{TIMESTAMP_ISO8601:timestamp}.*%{IP:ip}%{SPACE}%{WORD:company_name}%{SPACE}%{EMAILADDRESS:email}%{SPACE}%{URIPROTO:method}%{SPACE}%{URIPATH:page}%{SPACE}(?<browser>%{WORD}(/%{NUMBER})?)%{SPACE}\(%{GREEDYDATA:content}\).*\{%{GREEDYDATA:json}\}%{SPACE}(?<optional_code>%{WORD}?)
    

    它会输出,

    {
      "timestamp": [
        [
          "2016-09-01T10:58:41+02:00"
        ]
      ],
      "YEAR": [
        [
          "2016"
        ]
      ],
      "MONTHNUM": [
        [
          "09"
        ]
      ],
      "MONTHDAY": [
        [
          "01"
        ]
      ],
      "HOUR": [
        [
          "10",
          "02"
        ]
      ],
      "MINUTE": [
        [
          "58",
          "00"
        ]
      ],
      "SECOND": [
        [
          "41"
        ]
      ],
      "ISO8601_TIMEZONE": [
        [
          "+02:00"
        ]
      ],
      "ip": [
        [
          "165.225.76.76"
        ]
      ],
      "IPV6": [
        [
          null
        ]
      ],
      "IPV4": [
        [
          "165.225.76.76"
        ]
      ],
      "SPACE": [
        [
          "   ",
          " ",
          "    ",
          "    ",
          "  ",
          " ",
          "   "
        ]
      ],
      "company_name": [
        [
          "entreprise1"
        ]
      ],
      "email": [
        [
          "email1@gmail.com"
        ]
      ],
      "EMAILLOCALPART": [
        [
          "email1"
        ]
      ],
      "HOSTNAME": [
        [
          "gmail.com"
        ]
      ],
      "method": [
        [
          "POST"
        ]
      ],
      "page": [
        [
          "/application/controller/action"
        ]
      ],
      "browser": [
        [
          "Mozilla/5.0"
        ]
      ],
      "WORD": [
        [
          "Mozilla",
          "86rkt2dqsdze5if1bqldfl1"
        ]
      ],
      "NUMBER": [
        [
          "5.0"
        ]
      ],
      "BASE10NUM": [
        [
          "5.0"
        ]
      ],
      "content": [
        [
          "Windows NT 6.1; Trident/7.0; rv:11.0"
        ]
      ],
      "json": [
        [
          ""getid":"1""
        ]
      ],
      "optional_code": [
        [
          "86rkt2dqsdze5if1bqldfl1"
        ]
      ]
    }
    

    testing online 时请为电子邮件添加自定义模式,因为它们目前不受支持,

    EMAILLOCALPART [a-zA-Z][a-zA-Z0-9_.+-=:]+
    EMAILADDRESS %{EMAILLOCALPART}@%{HOSTNAME}
    

    【讨论】:

    • 非常感谢您对 Sufiyan 的帮助,它对我帮助很大。但是,我想知道是否可以使用 gork 创建自定义字段。例如,“页面”字段将始终为:应用程序/控制器/操作/某事,我可以创建 4 个不同的字段来表示“页面”字段,用“/”分成 4 个部分吗?另外,我想知道是否可以排除一个字段以便不将其插入索引中?谢谢
    • 是的,有可能。请查看 mutate 过滤器,elastic.co/guide/en/logstash/current/… 如果您有任何不同的问题,可以提出新问题。如果它解决了您的原始问题,请随时接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多