【问题标题】:Nginx grok pattern for logstash用于 logstash 的 Nginx grok 模式
【发布时间】:2017-05-26 23:39:05
【问题描述】:

以下是我的Nginx日志格式

log_format timed_combined '$http_x_forwarded_for - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' '$request_time $upstream_response_time $pipe';

以下是Nginx日志条目(供参考)

- - test.user [26/May/2017:21:54:26 +0000] "POST /elasticsearch/_msearch HTTP/1.1" 200 263 "https://myserver.com/app/kibana" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" 0.020 0.008 .

以下是 logstash grok 模式

NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:clientip} - - \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{NUMBER:request_time} %{NUMBER:upstream_time}

logstash 日志中发现错误

"status"=>400, "error"=>{"type"=>"mapper_parsing_exception", "原因"=>"无法解析 [时间戳]", "caused_by"=>{"type"=>"illegal_argument_exception", "reason"=>"无效 格式:\"26/May/2017:19:28:14 -0400\" 格式不正确 \"/May/2017:19:28:14 -0400\"

Issue: - Nginx logs are not getting grokked. 
Requirement: - Timestamp should be filtered into a particular field.

我的配置有什么问题?如何修复此错误?

【问题讨论】:

    标签: nginx logstash elastic-stack logstash-grok logstash-configuration


    【解决方案1】:

    您提供的日志行与默认的NGINXACCESS grok 模式不匹配,原因有两个:

    1. 作为日志行中的第一个元素,需要 IP 地址或主机名,但在您的日志行中,破折号 (-) 是第一个元素。
    2. 日志行中的第三个元素是用户名,但 grok 模式需要破折号 (-)

    所以有两种方法可以解决这个问题:

    1. 确保您的日志行与默认模式匹配
    2. 将 grok 模式更改为如下所示:
    
    NGINXACCESS - - %{USERNAME:username} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{NUMBER:request_time} %{NUMBER:upstream_time}
    

    我建议使用Grok debugger 来开发和调试grok 模式。它允许您逐步创建和测试它们。

    【讨论】:

    • 我已经使用 Grok 调试器修改了 grok 模式。现在,grok 过滤器与日志匹配。但是,仍然得到同样的错误。 caused_by"=>{"type"=>"illegal_argument_exception", "reason"=>"无效格式:\"29/May/2017:22:53:37 -0400\" 格式错误在 \"/May /2017:22:53:37 -0400\" @breml
    • 我不认为这个错误是由 grok 模式引起的,而是由 Logstash 配置中的其他部分引起的。因此,如果没有更多详细信息,将无法回答您关于上述错误的问题。
    • 我在新的测试服务器中尝试了相同的配置。它工作正常。所以,我认为弹性搜索重新索引将在这种情况下起作用。在我修改 Nginx 日志模式(为原始客户端 IP 添加参数并添加响应时间)后,这些冲突开始发生。您认为这可能是导致此错误的原因吗?
    【解决方案2】:

    这里是 nginx access.log 和 error.log 文件的模式。

    filter {
    
    ############################# NGINX ##############################
      if [event][module] == "nginx" {
    
    ########## access.log ##########
        if [fileset][name] == "access" {
          grok {
            match => { "message" => ["%{IPORHOST:ip} - %{DATA:user_name} \[%{HTTPDATE:time}\] \"%{WORD:http_method} %{DATA:url} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_sent_bytes} \"%{DATA:referrer}\" \"%{DATA:agent}\""] }
            remove_field => "message"
          }
          date {
            match => ["time", "dd/MMM/YYYY:HH:mm:ss Z"]
            target => "@timestamp"
            remove_field => "time"
          }
          useragent {
            source => "agent"
            target => "user_agent"
            remove_field => "agent"
          }
          geoip {
            source => "ip"
            target => "geoip"
          }
        }
    
    ########## error.log ##########
        else if [fileset][name] == "error" {
          grok {
            match => { "message" => ["%{DATA:time} \[%{DATA:log_level}\] %{NUMBER:pid}#%{NUMBER:tid}: (\*%{NUMBER:connection_id} )?%{GREEDYDATA:messageTmp}"] }
            remove_field => "message"
          }
          date {
            match => ["time", "YYYY/MM/dd HH:mm:ss"]
            target => "@timestamp"
            remove_field => "time"
          }
    
          mutate {
            rename => {"messageTmp" => "message"}
          }
        }
    
        grok {
          remove_field => "[event]"
        }
    
        mutate {
          add_field => {"serviceName" => "nginx"}
        }
      }
    

    }

    也适用于 tomcat:https://gist.github.com/petrov9/4740c61459a5dcedcef2f27c7c2900fd

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多