繁体   English   中英

Logstash日期无效格式

[英]Logstash date invalid format

尝试从rsylog服务器解析日志并将其插入elasticsearch。
我的传入日志行是

Feb 13 01:17:11 xxxx xxx-xxxx_error 2016/02/13 01:17:02 [error] 13689#0: *1956118 open() "xxxxxx" failed (2: No such file or directory), client: xx.xx.xx.xx, server: xxxxx.xx, request: "xxxxxxx HTTP/1.1", host: "xxxxx.xx"

我正在使用以下logstash过滤器提取字段:

grok {
match => {
    "message" => [
            "(?<logstamp>\h{3} \d{2} \d{2}:\d{2}:\d{2}) %{WORD:hostname} (?<source>[^\s]+) (?<timestamp>\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}) %{GREEDYDATA:error_message}" 
 ]
 }

date {
locale => "en"
match => [ "timestamp", "yyyy/MM/dd HH:mm:ss" ]
    }
}

mutate {
remove_field => [ "@version", "_score", "message", "host", "_type", "logstamp" ]
}

基于http://grokdebug.herokuapp.com/ ,我的语法是理智的。
我在日志行中有两个日期,因为第一个日期是rsyslog收到该行的日期,第二个日期是来自nginx的日期。 我想要的是将第二个传递给“时间戳”。

我在logstash中得到的错误是:

@metadata_accessors=#<LogStash::Util::Accessors:0x1d630482 @store={"path"=>"..."}, @lut={"[path]"=>[{"path"=>"..."}, 
"path"]}>, @cancelled=false>], :response=>{"create"=>{"_index"=>"...", "_type"=>"...", "_id"=>"...", "status"=>400, "error"=>{"type"=>"mapper_parsing_exception", 
"reason"=>"failed to parse [timestamp]", "caused_by"=>{"type"=>"illegal_argument_exception",
"reason"=>"Invalid format: \"2016/02/16 12:25:16\" is malformed at \"/02/16 12:25:16\""}}}}, :level=>:warn}

(我裁剪了输出以使其更短)

编辑:工作配置
我最终将时间戳从Nginx日志转换为更标准的时间戳(在ruby部分中看到),然后在date匹配中将其用作@timestamp

  grok {
match => {
    "message" => [
            "(?<logstamp>\h{3} \d{2} \d{2}:\d{2}:\d{2}) %{WORD:hostname} (?<source>[^\s]+) (?<ngxstamp>[^\s]+ [^\s]+) %{GREEDYDATA:error_message}"
     ]
    }
}

ruby {
code => "event['ngxstamp'] = event.timestamp.time.localtime.strftime('%Y-%m-%d %H:%M:%S')"
}

date {
match => [ "ngxstamp", "yyyy-MM-dd HH:mm:ss" ]
locale => "en"
}

mutate {
remove_field => [ "@version", "_score", "message", "host", "_type", "logstamp" ]
}

由于timestamp字段的类型为strict_date_optional_time ,因此您应在date过滤器中使用的日期模式应为

yyyy-MM-dd HH:mm:ss

代替

yyyy/mm/dd HH:mm:ss

所以:

  • 日期部分使用破折号代替斜杠
  • MM代替mm

不过,日期和时间部分之间缺少T可能仍然存在问题,因为strict_date_optional_time要求使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM