【问题标题】:Logstash pattern for nginx error lognginx 错误日志的 Logstash 模式
【发布时间】:2017-03-29 18:48:08
【问题描述】:

这是我的示例错误日志:

2017/03/29 17:32:56 [error] 21924#21924: *212595 access forbidden by rule, client: 172.31.0.14, server: , request: "POST /app/etc/local.xml HTTP/1.1", host: "www.overcart.com"

我想要一个与之匹配的 grok 模式。我不知道该怎么做。不知道如何创建一个。我尝试了各种方法,但都没有奏效。

我目前正在使用以下 grok 模式解析它:

%{DATESTAMP:mydate} [%{DATA:severity}] (%{NUMBER:pid:int}#%{NUMBER}: *%{NUMBER}|*%{NUMBER}) %{GREEDYDATA:mymessage}(?:, client: (?<client_ip>%{IP}|%{HOSTNAME})) (?:, server: %{IPORHOST:server})(?:, request: %{QS:request})?(?:, host: %{QS:host})?(?:, referrer: \"%{URI:referrer}) 

但它没有从(?:, server: 开始解析。

【问题讨论】:

  • 我正在使用 %{DATESTAMP:mydate} [%{DATA:severity}] (%{NUMBER:pid:int}#%{NUMBER}: *%{NUMBER}|*% {NUMBER}) %{GREEDYDATA:mymessage}(?:, client: (?%{IP}|%{HOSTNAME})) (?:, server: %{IPORHOST:server})(?:, request : %{QS:request})?(?:, host: %{QS:host})?(?:, referrer: \"%{URI:referrer}) 但它不是从 (?:, server: 开始解析.

标签: nginx logging logstash logstash-grok grok


【解决方案1】:

这是我使用的 grok 模式。它并不完美,可以改进,但它可以工作并解析一个额外的upstream 令牌。

(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER:threadid}\: \*%{NUMBER:connectionid} %{GREEDYDATA:errormessage}, client: %{IP:client}, server: %{GREEDYDATA:server}, request: "(?<httprequest>%{WORD:httpcommand} %{UNIXPATH:httpfile} HTTP/(?<httpversion>[0-9.]*))"(, )?(upstream: "(?<upstream>[^,]*)")?(, )?(host: "(?<host>[^,]*)")?

【讨论】:

    【解决方案2】:

    这是我用于 nginx-error 模式的,它可以解析我的错误日志中的所有字段。:

    (?<timestamp>\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}) \[%{DATA:err_severity}\] (%{NUMBER:pid:int}#%{NUMBER}: \*%{NUMBER}|\*%{NUMBER}) %{DATA:err_message}(?:, client: (?<clientip>%{IP}|%{HOSTNAME}))(?:, server: %{IPORHOST:server})(?:, request: "%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}")?(?:, upstream: "%{DATA:upstream}")?(?:, host: "%{IPORHOST:host}")?(?:, referrer: "%{URI:referrer}”)?
    

    【讨论】:

      【解决方案3】:

      我正在使用@mavlarn 的 grok 模式,它适用于我的用例。我相信@dr01 也会起作用。记得测试一下,看看什么对你有用!

      专业提示:因为这些 grok 模式中有双引号,为了使它们正常工作,我需要用单引号而不是双引号将模式括起来。

      为了突出显示,这里是一个例子。

      grok {
        match => { "message" => "This "double quote" pattern won't work. Backslashes to cancel/close the regex won't work either. Logstash will fail to start.."}
      }
      grok {
        match => { "message" => 'But this "double quote" pattern will work when surrounding with single quotes instead.'}
      }
      

      示例解决方案。

      grok {
        match => { "message" => '(?<timestamp>\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}) \[%{DATA:err_severity}\] (%{NUMBER:pid:int}#%{NUMBER}: \*%{NUMBER}|\*%{NUMBER}) %{DATA:err_message}(?:, client: (?<clientip>%{IP}|%{HOSTNAME}))(?:, server: %{IPORHOST:server})(?:, request: "%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}")?(?:, upstream: "%{DATA:upstream}")?(?:, host: "%{IPORHOST:host}")?(?:, referrer: "%{URI:referrer}”)?' }
      }
      

      (使用 Logstash v6.x 和 v7.x 测试)

      【讨论】:

        猜你喜欢
        • 2022-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多