logstash的Nginx grok图案

logstash的Nginx grok图案,nginx,logstash,elastic-stack,logstash-grok,logstash-configuration,Nginx,Logstash,Elastic Stack,Logstash Grok,Logstash Configuration,以下是我的Nginx日志格式 日志\u格式定时\u组合“$http\u x\u转发\u用于-$remote\u用户” [$time\u local]' “$request”$status$body\u bytes\u sent” “$http\u referer”“$http\u user\u agent” “$request_time$上游_response_time$管道” 以下是Nginx日志条目(供参考) 以下是logstash grok模式 NGUSERNAME [a-zA-Z\.\@

以下是我的Nginx日志格式

日志\u格式定时\u组合“$http\u x\u转发\u用于-$remote\u用户” [$time\u local]' “$request”$status$body\u bytes\u sent” “$http\u referer”“$http\u user\u agent” “$request_time$上游_response_time$管道”

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

以下是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}
在日志存储日志中发现错误

“状态”=>400,“错误”=>{“类型”=>“映射程序解析异常”, “原因”=>“未能分析[时间戳]”, 由“=>{”类型“=>”非法参数引起的“\u异常”,“原因”=>”无效 格式:\“26/May/2017:19:28:14-0400\”在中的格式不正确 \“/May/2017:19:28:14-0400\”


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

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

  • 作为日志行中的第一个元素,需要ip地址或主机名,但在日志行中,破折号(
    -
    )是第一个元素
  • 日志行中的第三个元素是用户名,但grok模式需要破折号(
    -
  • 所以有两种方法可以解决这个问题:

  • 确保日志行与默认模式匹配
  • 将grok模式更改为类似以下内容:

  • 我建议使用来开发和调试grok模式。它允许您以增量方式创建和测试它们。

    这里是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"}
        }
      }
    

    }

    我已经使用grok调试器修改了grok模式。现在,grok筛选器与日志匹配。但是,仍然得到相同的错误。由“=>{”type“=>“非法参数”异常引起,“原因”=>“无效格式:\”29/May/2017:22:53:37-0400\”在\“处格式不正确”/五月/2017:22:53:37-0400\"@bremlI不认为此错误是由grok模式引起的,而是日志存储配置中的另一部分。因此,如果没有进一步的详细信息,将无法回答您关于上述错误的问题。我在新的测试服务器中尝试了相同的配置。它工作正常。因此,我认为弹性搜索重新索引将在这种情况下工作。这些冲突是在我修改Nginx日志模式(为原始客户端IP添加了参数并添加了响应时间)后开始发生的。您认为这可能是导致此错误的原因吗?
    Issue: - Nginx logs are not getting grokked. 
    Requirement: - Timestamp should be filtered into a particular field.
    
    
    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}
    
    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"}
        }
      }