Logstash фильтрация
У меня есть сценарий Python, который записывает объекты JSON (строка за строкой) в /var/log/myLog.json в следующем формате:
{"timestamp":"2016-07-21T01:20:04.392799-0400","in_iface":"docker0","event_type":"alert","src_ip":"172.17.0.2","dest_ip":"172.17.0.3","proto":"ICMP","icmp_type":0,"icmp_code":0,"alert":{"action":"allowed","**gid**":2,"signature_id":2,"rev":0,"signature":"ICMP msg","category":"","severity":3},"payload":"hFuQVwAA","payload_printable":"kk"}
Я хотел бы использовать Logstash для того, чтобы:
Читайте объекты json построчно из /var/log/myLog.json
Разобрать gid и переслать на другую машину как сообщение udp (с указанием определенного IP-адреса + порт) - Например: если gid==2, то перенаправить этот объект json на 172.123.10.3:10001
Кроме того, я хотел бы иметь возможность динамически обновлять этот фильтр файла конфигурации Logstash (иначе говоря, чтобы можно было добавить еще одно правило, например: "если gid==x, то значит, что этот json-объект переходит на другой IP-адрес).
Как я могу это сделать?
Как должны выглядеть файлы конфигурации Logstash? А как выглядит команда для вставки / удаления динамических фильтров?
Спасибо, парни.
1 ответ
Вы можете запустить logstash, как показано ниже. и я проверил два образца данных JSON.
{"timestamp":"2016-07-21T01:20:04.392799-0400","in_iface":"docker0","event_type":"alert","src_ip":"172.17.0.2","dest_ip":"172.17.0.3","proto":"ICMP","icmp_type":0,"icmp_code":0,"alert":{"action":"allowed","gid":2,"signature_id":2,"rev":0,"signature":"ICMP msg","category":"","severity":3},"payload":"hFuQVwAA","payload_printable":"kk"}
{"timestamp":"2016-07-21T01:20:04.392799-0400","in_iface":"docker0","event_type":"alert","src_ip":"172.17.0.2","dest_ip":"172.17.0.3","proto":"ICMP","icmp_type":0,"icmp_code":0,"alert":{"action":"allowed","gid":3,"signature_id":2,"rev":0,"signature":"ICMP msg","category":"","severity":3},"payload":"hFuQVwAA","payload_printable":"kk"}
input {
file {
path => "/etc/logstash/jsonSample.log"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
json {
source => "message"
target => "doc"
add_field => {"alert.gid" => "%{[doc][alert][gid]}"}
add_tag => ["tagName_%{[doc][alert][gid]}"]
}
}
output {
if "tagName_2" in [tags] {
stdout {codec => rubydebug}
}else if "tagName_3" in [tags] {
}
}
Тогда вы можете увидеть результат
{
"message" => "{\"timestamp\":\"2016-07-21T01:20:04.392799-0400\",\"in_iface\":\"docker0\",\"event_type\":\"alert\",\"src_ip\":\"172.17.0.2\",\"dest_ip\":\"172.17.0.3\",\"proto\":\"ICMP\",\"icmp_type\":0,\"icmp_code\":0,\"alert\":{\"action\":\"allowed\",\"gid\":2,\"signature_id\":2,\"rev\":0,\"signature\":\"ICMP msg\",\"category\":\"\",\"severity\":3},\"payload\":\"hFuQVwAA\",\"payload_printable\":\"kk\"}",
"@version" => "1",
"@timestamp" => "2016-07-25T04:41:11.980Z",
"path" => "/etc/logstash/jsonSample.log",
"host" => "baklava",
"doc" => {
"timestamp" => "2016-07-21T01:20:04.392799-0400",
"in_iface" => "docker0",
"event_type" => "alert",
"src_ip" => "172.17.0.2",
"dest_ip" => "172.17.0.3",
"proto" => "ICMP",
"icmp_type" => 0,
"icmp_code" => 0,
"alert" => {
"action" => "allowed",
"gid" => 2,
"signature_id" => 2,
"rev" => 0,
"signature" => "ICMP msg",
"category" => "",
"severity" => 3
},
"payload" => "hFuQVwAA",
"payload_printable" => "kk"
},
"alert.gid" => 2,
"tags" => [
[0] "tagName_2"
]
}
Вы также можете изменить применяемую конфигурацию, как указано выше.
С уважением.
Вы можете сослаться на конфигурацию события и фильтр json https://www.elastic.co/guide/en/logstash/current/event-dependent-configuration.html
https://www.elastic.co/guide/en/logstash/current/plugins-filters-json.html