Здравствуйте!
Уже писал вот сюда Использование файлов из output path, для восстановления удаленного индекса, но там сумбур какой-то получился, поэтому решил создать отдельный топик по этому вопросу.
Итак, у меня есть пример лога:
2019-06-10T20:32:08.505Z {name=srv-1} {"tags":["event","quick-login","success"],"userId":"100000000","organizationId":"000000000003"}
2019-06-10T20:32:08.505Z {name=srv-1} 20:32:08.505 [elastic-993] INFO LogMessage - {"tags":["event","quick-login","success"],"userId":"100000000","organizationId":"000000000003"}
По сути это один и тот же лог, но второй более детален, и нужно распарсить и положить в эластик именно его. Для этого я сделал грок фильтр:
input {
file {
path => "/path/to/log-file"
tags => ["recovery"]
start_position => "beginning"
sincedb_path => "/path/to/sincedb_access"
}
}
filter {
if "recovery" in [tags] {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} \{name=(%{DATA:beat.name})\} %{TIME:time} \[%{DATA:thread}\] %{DATA:level} %{DATA:logger} - %{GREEDYDATA:msg}" }
}
date {
match => [ "timestamp", "ISO8601", "YYYY-MM-dd HH:mm:ss,SSS" ]
target => "@timestamp"
}
mutate { remove_field => [ "time" ] }
json {
source => "msg"
target => "message"
}
mutate { remove_field => [ "msg" ] }
}
}
output {
if "recovery" in [tags] {
elasticsearch {
hosts => "127.0.0.1:9200"
index => "index.log"
}
file {
path => "/path/to/test-output"
codec => rubydebug
}
}
}
Я сделал вывод в файл, помимо вывода в индекс, чтобы можно было понимать, что происходит с логами после грок фильтра. Возможно это не оптимальный вариант, но другого не придумал.
По итогу работы в файл попадает следующее:
{
"host" => "srv-1",
"tags" => [
[0] "recovery",
[1] "_grokparsefailure"
],
"@version" => "1",
"message" => "2019-06-10T20:32:08.505Z {name=srv-1} {\"tags\":[\"event\",\"quick-login\",\"success\"],\"userId\":\"100000000\",\"organizationId\":\"000000000003\"}",
"@timestamp" => 2019-12-19T12:28:31.779Z,
"path" => "/path/to/log-file"
}
{
"host" => "srv-1",
"tags" => [
[0] "recovery"
],
"@version" => "1",
"logger" => "LogMessage",
"beat.name" => "srv-1",
"message" => {
"tags" => [
[0] "event",
[1] "quick-login",
[2] "success"
],
"userId" => "100000000",
"organizationId" => "000000000003"
},
"@timestamp" => 2019-06-10T20:32:08.505Z,
"timestamp" => "2019-06-10T20:32:08.505Z",
"thread" => "elastic-993",
"path" => "/path/to/log-file",
"level" => "INFO"
}
Первый лог не был обработан гроком, и это правильно, второй был. Но в эластик отправляется только первый лог. ЧЯДНТ?