【问题标题】:Converting date format to YYYY-MM-DD from YYYY/MM/DD HH:MM:SS format in Logstash for nginx error logs在 nginx 错误日志的 Logstash 中将日期格式从 YYYY/MM/DD HH:MM:SS 格式转换为 YYYY-MM-DD
【发布时间】:2015-10-06 12:23:12
【问题描述】:

我有以下形式的 nginx 错误日志:-

2015/09/30 22:19:38 [错误] 32317#0: *23 [lua] response.lua:61: handler():Cassandra错误:唯一检查期间出错:Cassandra 错误:连接被拒绝,客户端:127.0.0.1,服务器:,请求:“POST /consumers/ HTTP/1.1”,主机:“localhost:8001”

here 所述,我能够解析这些日志。

我的过滤器配置如下:-

filter {  
  grok {
      match => {
        "message" => [
          "%{DATESTAMP:mydate} \[%{DATA:severity}\] (%{NUMBER:pid:int}#%{NUMBER}: \*%{NUMBER}|\*%{NUMBER}) %{GREEDYDATA:mymessage}",
          "%{DATESTAMP:mydate} \[%{DATA:severity}\] %{GREEDYDATA:mymessage}",
          "%{DATESTAMP:mydate} %{GREEDYDATA:mymessage}"
        ]
      }
      add_tag => ["nginx_error_pattern"]
    }

    if ("nginx_error_pattern" in [tags]) {      
      grok {
        match => {
          "mymessage" => [
            "server: %{DATA:[request_server]},"
          ]
        }        
      }

      grok {
        match => {
          "mymessage" => [
            "host: \"%{IPORHOST:[request_host]}:%{NUMBER:[port]}\""
          ]
        }        
      }

      grok {
        match => {
          "mymessage" => [
            "request: \"%{WORD:[request_method]} %{DATA:[request_uri]} HTTP/%{NUMBER:[request_version]:float}\""
          ]
        }        
      }

      grok {
        match => {
          "mymessage" => [
            "client: %{IPORHOST:[clientip]}",
            "client %{IP:[clientip]} "
          ]
        }        
      }

      grok {
        match => {
          "mymessage" => [
            "referrer: \"%{DATA:[request_referrer]}\""
          ]
        }       
      }                
    }
}

mydate 的日期为:-

"mydate" => "15/09/30 22:19:38"

有人可以告诉我如何添加一个日期为2015-09-30 的字段(比如log_day)吗?

【问题讨论】:

    标签: logstash logstash-grok logstash-configuration


    【解决方案1】:

    将时间/日期保存在date 类型的字段中总是一个好主意。它使您能够使用 Elasticsearch 或 Kibana 执行 complex range queries

    您可以使用logstash's date filter 来解析日期。

    过滤器:

    date {
        match => [ "mydate", "YY/MM/dd HH:mm:ss" ]
    }
    

    结果:

    "@timestamp" => "2015-09-30T20:19:38.000Z"
    

    日期过滤器默认将结果放在@timestamp 字段中。

    避免默认映射@timestamp字段,请指定目标字段,如“log_day”,如下所示:

    过滤器:

    date {
        match => [ "mydate", "YY/MM/dd HH:mm:ss" ]
        target => "log_day"
    }
    

    结果:

    "log_day" => "2015-09-30T20:19:38.000Z"
    

    一旦有了date 类型的字段,您就可以继续进行进一步的操作。您可以使用date_formatter 过滤器以您的特殊格式创建另一个日期字段。

    date_formatter {
            source => "log_day"
            pattern => "YYYY-MM-dd"
    }
    

    结果:"log_day" => "2015-09-30"

    【讨论】:

    • 谢谢@hurb。这按预期工作。我有一个后续问题。我们可以在不修改@timestamp 字段的情况下做到这一点吗?现在这将用日志中的日期覆盖@timestamp
    • 当然,只需将target => "log_day" 添加到您的日期过滤器即可。见我编辑。
    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 2015-11-03
    • 2017-08-21
    • 2017-06-24
    • 2016-01-02
    • 1970-01-01
    相关资源
    最近更新 更多