Проблемы с настройкой logstash для вывода электронной почты
Я пытаюсь настроить logstash для отправки оповещений по электронной почте и вывода журнала в asticsearch / kibana.
У меня есть журналы, успешно синхронизирующиеся через rsyslog, но я получаю следующую ошибку при запуске
/opt/logstash-1.4.1/bin/logstash agent -f /opt/logstash-1.4.1/logstash.conf --configtest
Ошибка: ожидается один из #, {,,, ] в строке 23, столбце 12 (байт 387) после фильтра {if [program] == "nginx-access" {
grok {match => ["message", "% {IPORHOST: remote_addr} -% {USERNAME: remote_user} [% {HTTPDATE: time_local}]% {QS: request}% {INT: status}% {INT: body_bytes_sent} % {QS: http_referer}% {QS: http_user_agent} ”]}}}
output {stdout {}asticsearch { embedded => false host => "
Вот мой конфигурационный файл logstash
input {
syslog {
type => syslog
port => 5544
}
}
filter {
if [program] == "nginx-access" {
grok {
match => [ "message" , "%{IPORHOST:remote_addr} - %{USERNAME:remote_user} \[% {HTTPDATE:time_local}\] %{QS:request} %{INT:status} %{INT:body_bytes_sent} %{QS:http_referer} %{QS:http_user_agent}” ]
}
}
}
output {
stdout { }
elasticsearch {
embedded => false
host => "localhost"
cluster => "cluster01"
}
email {
from => "logstash.alert@nowhere.com"
match => [
"Error 504 Gateway Timeout", "status,504",
"Error 404 Not Found", "status,404"
]
subject => "%{matchName}"
to => "you@example.com"
via => "smtp"
body => "Here is the event line that occured: %{@message}"
htmlbody => "<h2>%{matchName}</h2><br/><br/><h3>Full Event</h3><br/><br/><div align='center'>%{@message}</div>"
}
}
Я проверил строку 23, на которую ссылается ошибка, и она выглядит нормально.... Я попытался удалить фильтр, и все работает... без изменения этой строки.
Пожалуйста помоги
редактировать
Теперь я изменил свой конфиг на этот
input {
syslog {
type => syslog
port => 5544
}
}
filter {
grok {
type => "syslog"
match => ["syslog_program","nginx-access"]
match => [ "message","%{IPORHOST:remote_addr} - %{USERNAME:remote_user} \[%{HTTPDATE:time_local}\] %{QS:request} %{INT:status} %{INT:body_bytes_sent} %{QS:http_referer} %{QS:http_user_agent}" ]
add_field => [ "nginx_response", "%{NUMBER:response}" ]
}
}
output {
stdout {}
elasticsearch {
embedded => false
host => "localhost"
cluster => "cluster01"
}
email {
match => [ "status", "status,304"]
to => "test@test.com"
from => "test@test.com"
options => [ "smtpIporHost", "",
"port", "",
"userName", "",
"password", "",
"starttls", "",
"authenticationType", ""
]
via => "smtp" # or pop or sendmail
subject => "Found %{IP:client} Alert on %{@source_host}"
body => "Here is the event line %{@message}"
htmlbody => "<h2>%{matchName}</h2><br/><br/><h3>Full Event</h3><br/><br/><div align='center'>%{@message}</div>"
}
}
Кажется, это работает, насколько я вижу, что теперь он распознает вещи в logstash, и что там есть команда плагина электронной почты, но совпадение не удается..... какие-нибудь идеи?
Спасибо
2 ответа
Вам не нужно разбирать [program]
первый? Я не думаю, что поле ввода вообще выполняет какую-либо фильтрацию, поэтому вам может потребоваться начать с %SYSLOGBASE
http://logstash.net/docs/1.4.1/filters/grok
Вы можете попробовать вместо этого, возможно:
if [message] =~ /nginx-access/ {
Какое ключевое слово будет соответствовать вашему message
поле. Это по крайней мере скажет вам, если это то, что здесь происходит.
Вывод электронной почты не поддерживает функцию соответствия. Вместо этого вы могли бы добавить add_tag к успешному совпадению с grok, а затем поместить условие в вывод своей электронной почты, чтобы отправлять только определенные электронные письма в зависимости от заданного вами тега.