2016-08-22 2 views
0

Можно ли конвертировать дату с «2016-08-22T09: 09: 55.487Z» в UNIX time в Logstash? Я видел противоположную операцию, но ничего об этом.Преобразование даты в UNIX-время в Logstash

+0

Когда вы просите UNIX время, вы могли бы указать ехр выведенный выход? И вы ожидаете число или строку? – baudsp

+0

@baudsp, я ожидаю такой номер: 1431607046 – Anatoly

ответ

1

Во-первых, вам придется конвертировать "2016-08-22T09:09:55.487Z" на объект даты, с указанием даты фильтра:
(предполагая, что поле date содержит строку, представляющую действительную ISO8601 временную метку)

date { 
    match => ["date", "ISO8601"] 
    target => "date_object" 
} 

На данный момент у вас будет поле date_object, содержащее метку времени старта. Эта метка времени может быть преобразована в ее эквивалент эпохи с помощью метода to_i.
Для этого нам понадобится использовать рубиновый фильтр, который позволяет выполнять рубиновый код в качестве фильтра.

ruby {  
    code => "event['date_epoch'] = event['date_object'].to_i" 
}   

Тогда вы будете иметь поле date_epoch, который будет число, представляющее время UNIX.

2

Сегодня я столкнулся с подобной проблемой. К сожалению, мир конфигурации выше, имеет ограничение, что теряет миллисекунды из временной метки во время целочисленного преобразования:

рубин {
код => «событие [„date_epoch“] = событие [„date_object“] .to_i»
}

Я попробовал несколько вариантов, включая преобразования объекта дата плавать, умножая его на 1000, а затем обратно в строку. Суть в том, что точность не совсем то же самое.

Наконец-то я придумал это немного hacky образец ниже. Он работал с logstash версии 2.4.1. Так первый я создаю поле tmpTimestamp для того, чтобы преобразовать анализируемую метку времени в обычную строку:

mutate{ 
add_field => ["tmpTimestamp","%{@timestamp}"] 
} 

Мирный рубинового кода, чтобы бросить строку в стандартный формат рубин DateTime, преобразовать его в формат эпоха (в том числе мс), а затем обратно в строку:

ruby { code => "require 'date';event['epoch'] = DateTime.parse(event['tmpTimestamp']).strftime('%Q').to_s" } 

Удалить неиспользуемую переменную TMP:

mutate{ 
remove_field => ["tmpTimestamp"] 
} 
+0

Также см. Это для общего преобразования даты Ruby в эпоху: https://stackoverflow.com/a/14733261/2695332 Ввод даты не обязательно должен быть всей меткой времени. Это может быть только дата в форматах, таких как MM/DD/YYYY или MM-DD-YYYY и т. Д. – Vikas

Смежные вопросы