Проблемы с шаблоном Grok с logstash и postfix

У меня возникают проблемы с анализом определенной строки данных для моего сервера elasticsearch, чтобы сделать его доступным для поиска и т. Д.

Я пытаюсь сделать так, чтобы postfix регистрировал строку темы всех сообщений, проходящих через систему. Я знаю, что это немного серая зона для регистрации данных, но, похоже, она работает.

Чтобы добиться этого, я отредактировал main.cf в моем постфиксном файле, чтобы выполнить проверку заголовка для строки темы, записать его на уровне INFO и записать в почтовый журнал.

Таким образом, тема сообщения поступает из процесса очистки постфикса и выглядит примерно так в кибане, предварительно разобранном:

Table
JSON
@timestamp      January 8th 2016, 11:51:10.951
t@version       1
t_id            AVIiJeGaAHt2sxJKgJgY
t_index         logstash-2016.01.08
#_score         [empty]
t_type          log
#count          1
tfields.type        postfix
tfrom           [Incoming server]
thelo           [Test computer]
tinput_type     [empty]
#line           715
tmessage        Jan  8 11:51:10 testserver postfix/cleanup[19150]: CFEBE81B5877: info: header Subject: Test Messages from unknown[10.21.2.166]; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<testcomputer>
#offset         226,216
tproto          ESMTP
tshipper        Testserver
tsource         /var/log/maillog
ttags           _grokparsefailure
tto             [email protected]
ttype           log

Вот мой файл шаблонов Grok, который я использую:

# Postfix stuff based on https://gist.github.com/jbrownsc/4694374:
# ORIGINAL POSTFIX PATTERNS #
QUEUEID (?:[A-F0-9]+|NOQUEUE)
EMAILADDRESSPART [a-zA-Z0-9_.+-=:]+
EMAILADDRESS %{EMAILADDRESSPART:local}@%{EMAILADDRESSPART:remote}
RELAY (?:%{HOSTNAME:relayhost}(?:\[%{IP:relayip}\](?::[0-9]+(.[0-9]+)?)?)?)
POSREAL [0-9]+(.[0-9]+)?
DELAYS (%{POSREAL}[/]*)+
DSN %{NONNEGINT}.%{NONNEGINT}.%{NONNEGINT}
STATUS sent|deferred|bounced|expired
PERMERROR 5[0-9]{2}
MESSAGELEVEL reject|warning|error|fatal|panic
POSTFIXACTION discard|dunno|filter|hold|ignore|info|prepend|redirect|replace|reject|warn

# postfix/smtp and postfix/lmtp and postfix/local
POSTFIXSMTPRELAY %{QUEUEID:qid}: to=<%{EMAILADDRESS:to}>,(?:\sorig_to=<%{EMAILADDRESS:orig_to}>,)? relay=%{RELAY}, delay=%{POSREAL:delay}, delays=%{DELAYS:delays}, dsn$
POSTFIXSMTPCONNECT connect to %{RELAY}: %{GREEDYDATA:reason}
POSTFIXSMTP4XX %{QUEUEID:qid}: host %{RELAY} said: %{GREEDYDATA:reason}
POSTFIXSMTP5XX %{QUEUEID:qid}: to=<%{EMAILADDRESS:to}>,(?:\sorig_to=<%{EMAILADDRESS:orig_to}>,)? relay=%{RELAY}, delay=%{POSREAL:delay}, delays=%{DELAYS:delays}, dsn=%$
POSTFIXSMTPREFUSAL %{QUEUEID:qid}: host %{RELAY} refused to talk to me: %{GREEDYDATA:reason}
POSTFIXSMTPLOSTCONNECTION %{QUEUEID:qid}: lost connection with %{RELAY} while %{GREEDYDATA:reason}
POSTFIXSMTPTIMEOUT %{QUEUEID:qid}: conversation with %{RELAY} timed out while %{GREEDYDATA:reason}

# postfix/smtpd
POSTFIXSMTPDCONNECTS (?:dis)?connect from %{RELAY}
POSTFIXSMTPDACTIONS %{QUEUEID:qid}: %{POSTFIXACTION}: %{DATA:command} from %{RELAY}: %{DATA:smtp_response}: %{DATA:reason}; from=<%{EMAILADDRESS:from}> to=<%{EMAILADDR$
POSTFIXSMTPDTIMEOUTS timeout after %{DATA:command} from %{RELAY}
POSTFIXSMTPDLOGIN %{QUEUEID:qid}: client=%{DATA:client}, sasl_method=%{DATA:saslmethod}, sasl_username=%{EMAILADDRESS:saslusername}
POSTFIXSMTPDCLIENT %{QUEUEID:qid}: client=%{DATA:client}

# postfix/cleanup
POSTFIXCLEANUP %{QUEUEID:qid}: %{DATA:type_alert}: %{GREEDYDATA:subject} from %{RELAY}; message-id=<%{EMAILADDRESS:messageid}>

# postfix/bounce
POSTFIXBOUNCE %{QUEUEID:qid}: sender non-delivery notification: %{QUEUEID:bouncequeueid}

# postfix/qmgr and postfix/pickup
POSTFIXQMGR %{QUEUEID:qid}: (?:removed|from=<(?:%{EMAILADDRESS:from})?>(?:, size=%{POSINT:size}, nrcpt=%{POSINT:nrcpt} \(%{GREEDYDATA:queuestatus}\))?)

# postfix/warm
POSTFIXINFO %{QUEUEID:qid}

Как видите, он не хочет разбирать за меня строку темы. Я попытался внести правильные изменения в шаблон постфикс / очистка, но, похоже, он не работает. Я новичок в построении рисунка Grok, и любая помощь будет оценена по достоинству.

Заявление Grok для логасташа:

input {
    file {
        type => "postfix"
        path => "/var/log/maillog"
    }
}

    filter {
        grok {
            patterns_dir => [ "/etc/logstash/patterns.d" ]
            pattern => [
                "%{SYSLOGBASE} %{POSTFIXSMTPDCONNECTS}",
                "%{SYSLOGBASE} %{POSTFIXSMTPDACTIONS}",
                "%{SYSLOGBASE} %{POSTFIXSMTPDTIMEOUTS}",
                "%{SYSLOGBASE} %{POSTFIXSMTPDLOGIN}",
                "%{SYSLOGBASE} %{POSTFIXSMTPDCLIENT}",
                "%{SYSLOGBASE} %{POSTFIXSMTPRELAY}",
                "%{SYSLOGBASE} %{POSTFIXSMTPCONNECT}",
                "%{SYSLOGBASE} %{POSTFIXSMTP4XX}",
                "%{SYSLOGBASE} %{POSTFIXSMTP5XX}",
                "%{SYSLOGBASE} %{POSTFIXSMTPREFUSAL}",
                "%{SYSLOGBASE} %{POSTFIXSMTPLOSTCONNECTION}",
                "%{SYSLOGBASE} %{POSTFIXSMTPTIMEOUT}",
                "%{SYSLOGBASE} %{POSTFIXBOUNCE}",
                "%{SYSLOGBASE} %{POSTFIXQMGR}",
                "%{SYSLOGBASE} %{POSTFIXCLEANUP}",
                "%{SYSLOGBASE} %{POSTFIXINFO}"
            ]
            named_captures_only => true
        }
    }

person Creibold    schedule 08.01.2016    source источник
comment
Нам нужно увидеть вашу строфу фильтра grok {}.   -  person Alain Collins    schedule 08.01.2016
comment
Просто добавил внизу.   -  person Creibold    schedule 08.01.2016
comment
Какой узор, по вашему мнению, будет соответствовать теме? Единственное, что я вижу, которое создает поле «тема», это POSTFIXCLEANUP, но ваша строка ввода не содержит всех полей, требуемых этим шаблоном.   -  person Alain Collins    schedule 08.01.2016
comment
Не связано, но представьте себе стоимость выполнения до 16 совпадений регулярных выражений, чтобы увидеть, начинается ли строка с SYSLOGBASE. Подумайте о том, чтобы сделать это одним разделом grok {}, а затем проверьте оставшуюся часть на предмет POSTFIX. См. svops.com/blog/processing-common-event-information- with-grok   -  person Alain Collins    schedule 08.01.2016
comment
Так что все, что мне нужно сделать, это закончить строку grok, чтобы она соответствовала ей, и теоретически она должна правильно разбираться? Еще раз прошу прощения, у меня нет большого опыта работы с фильтрами Grok.   -  person Creibold    schedule 08.01.2016
comment
Я обновил шаблон Postfix / cleanup до: POSTFIXCLEANUP %{QUEUEID:qid}: %{DATA:type_alert}: %{GREEDYDATA:subject} from %{RELAY}; to=<%{EMAILADDRESS:to}> %{DATA:proto) <%{IPORHOST}>, но, похоже, он все еще не разбирает его.   -  person Creibold    schedule 08.01.2016


Ответы (1)


Ваш шаблон должен соответствовать вашему вводу, как указано в предыдущих комментариях. Если вы посмотрите на свой ввод, он имеет несколько разделов после SYSLOGBASE. (Номера строк добавлены для обсуждения):

1. CFEBE81B5877:
2. info:
3. header Subject: Test Messages from unknown[10.21.2.166];
4. from=<[email protected]>
5. to=<[email protected]>
6. proto=ESMTP
7. helo=<testcomputer>

Таким образом, ваш шаблон должен учитывать все (или, при некоторых обстоятельствах, некоторые) эти данные.

Даже ваш новый шаблон не делает этого (опять же, разделенный числами для разговорной ценности):

1. %{QUEUEID:qid}:
2. %{DATA:type_alert}:
3. %{GREEDYDATA:subject} from %{RELAY};
to=<%{EMAILADDRESS:to}>
%{DATA:proto)
<%{IPORHOST}>

Номера строк 1-3 вашего ввода совпадают с номерами 1-3 вашего шаблона, который вы можете протестировать в отладчике grok.

Но посмотрите на строку 4 ввода. В вашем шаблоне нет ничего, что соответствовало бы ему. Таким образом, весь шаблон не совпадает, и вы не получаете полей.

Универсальный совет для Grok - использовать отладчик, начиная с замедления, перемещая одно поле за раз слева. Это убережет вас от пропуска полей и убедитесь, что вас устраивает синтаксический анализ по мере продвижения.

person Alain Collins    schedule 10.01.2016
comment
Спасибо, это ответ на мой вопрос! - person Creibold; 13.01.2016