Я пытаюсь настроить logstash для отправки предупреждений по электронной почте и вывода журнала в elasticsearch / kibana.
У меня журналы успешно синхронизируются через rsyslog, но при запуске появляется следующая ошибка
/opt/logstash-1.4.1/bin/logstash агент -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} ”]}}}
вывод {stdout {} elasticsearch {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 и что там есть команда плагина электронной почты, но совпадение не удается ..... какие-нибудь идеи?
Спасибо
Вам не нужно разбирать [program]
первый? Я не думаю, что поле 'input' вообще выполняет какую-либо фильтрацию, поэтому вам может потребоваться начать с %SYSLOGBASE
http://logstash.net/docs/1.4.1/filters/grok
Вместо этого вы могли бы попробовать:
if [message] =~ /nginx-access/ {
Какое ключевое слово будет соответствовать вашему message
поле. Это по крайней мере скажет вам, если это является что тут происходит.
В Эл. адрес вывод не поддерживает функцию соответствия. Вместо этого вы могли бы добавить метку для успешного совпадения Grok, а затем поместите условие вокруг вывода электронной почты, чтобы отправлять только определенные электронные письма в зависимости от тега, который вы определили.