Назад | Перейти на главную страницу

Проблемы с настройкой logstash для вывода электронной почты

Я пытаюсь настроить 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, а затем поместите условие вокруг вывода электронной почты, чтобы отправлять только определенные электронные письма в зависимости от тега, который вы определили.