2016-02-16 2 views
0

Попытка разобрать журналы с сервера rsylog и вставить их в поиск elastics.
Мой входящий лаглинь являетсяLogstash date invalid format

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. То, что я хочу, это передать второе значение «timestamp».

Я получаю ошибку в 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} 

(я подрезал выход, чтобы сделать его короче)

EDIT: РАБОЧАЯ CONFIG
Я в конечном итоге преобразования метку времени из журнала 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" ] 
} 
+0

Похоже, что ваш шаблон даты неправильный: 'yyyy/mm/dd HH: mm: ss' должен читать' yyyy/MM/dd HH: mm: ss', т.е. «месяц года» должен быть «MM» не 'mm'. Можете ли вы попробовать это? – Val

+0

argh, извините, что это была неправильная паста. друг сказал мне умышленно поставить мм вместо ММ, хотя я сказал ему, что мм стоит минут. Ошибка сохраняется для MM. – w00t

+0

Хорошо, хотя ошибка не на уровне logstash, но, похоже, больше на уровне ES. Можете ли вы показать отображение, которое у вас есть с помощью 'curl -XGET localhost: 9200/your_index/_mapping/your_type'? Похоже, что тип поля timestamp - это номер как-то, а не тип 'date' ... – Val

ответ

3

Поскольку тип вашего 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 мандатов это, хотя ,