grok: в чем разница между шаблоном grok timestamp и фильтром даты logstash
Я изучаю logstash и как использовать его фильтры и шаблоны grok. У меня есть одно сомнение, которое я должен прояснить.
Предположим, что наши журналы содержат поле метки времени, например:
[01/Sep/2015:06:22:11 -0400]
Используя grok, я могу определить шаблон для захвата этого как HTTPDATE, например:
[%{HTTPDATE:timestamp}]
В отладчике grok я вижу, что он смог определить дату, время и т. д. Из этого:
{
"timestamp": [
[
"01/Sep/2015:06:22:11 -0400"
]
],
"MONTHDAY": [
[
"01"
]
],
"MONTH": [
[
"Sep"
]
],
"YEAR": [
[
"2015"
]
],
"TIME": [
[
"06:22:11"
]
],
"HOUR": [
[
"06"
]
],
"MINUTE": [
[
"22"
]
],
"SECOND": [
[
"11"
]
],
"INT": [
[
"-0400"
]
]
}
Теперь я смотрел учебник на веб-сайте logstash, где они используют другой фильтр дат, чтобы сохранить это в поле даты. Вот так:
date {
match => [ "timestamp", "dd/MMM/YYYY:MM:mm:ss Z"]
locale => en
}
То, что это делает, - это сохранение другого поля с другой датой форматирования. Мой вопрос в том, зачем хранить два поля даты, представляющие одну и ту же дату, только с разным форматом. Нельзя ли использовать поле даты с первого этапа так же, как мы можем использовать поле даты со второго этапа ?
1 ответ:
Grok{} используется для преобразования неструктурированной строки в структурированные данные. После его запуска у вас теперь есть строка под названием "отметка времени". Если это все, что вам нужно, вы закончили!
Но что, если вы хотите Использовать это значение в качестве даты, а не строки? Вот где появляется фильтр даты {}. Вы даете date{} строковое поле и формат строки, и это сделает вас объектом даты, который вы можете сохранить в elasticsearch.
Затем вы можете использовать elasticsearch запросы, связанные с датой ("сколько записей с 5 минут назад?") что было бы невозможно, если бы все, что у тебя было-это веревка.
По умолчанию date{} задает поле @timestamp, которое kibana будет использовать для оси x ваших гистограмм, поэтому установка его на время, когда событие было сгенерировано (в отличие от того, когда оно было обработано logstash), является "хорошей вещью".
После того, как фильтр date{} обновил @timestamp значением, возможно, имеет смысл удалить метку времени поле. Это можно сделать с помощью параметра remove_field для фильтра даты (который будет выполняться только в том случае, если фильтр прошел успешно).
Надеюсь, это поможет.
Comments