logstash 和 postfix 的 Grok 模式问题
Grok pattern issues with logstash and postfix
我在为我的 elasticsearch 服务器解析特定行数据时遇到问题,以便使其可搜索等。
我在这里尝试做的是让 postfix 记录通过系统的所有消息的主题行。我知道这对于数据记录来说有点灰色地带,但它似乎有效。
为了实现这一点,我编辑了我的后缀文件中的 main.cf 以对主题行执行标头检查并将其记录在 INFO 级别并将其写入邮件日志。
因此,消息的主题行来自 postfix 清理过程,在 kibana 中看起来像这样,一旦解析出来:
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=<Test@testserver.com> to=<example@example.com> proto=ESMTP helo=<testcomputer>
#offset 226,216
tproto ESMTP
tshipper Testserver
tsource /var/log/maillog
ttags _grokparsefailure
tto example@example.com
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}
如您所见,它不想为我解析出主题行。我试图在 postfix/cleanup 模式下进行正确的更改,但它似乎不起作用。我是 grok 模式构造的新手,将不胜感激。
logastash 的 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
}
}
如前面的评论所述,您的模式必须与您的输入相匹配。如果您查看您的输入,它在 SYSLOGBASE 之后有几个部分。 (为便于讨论而添加的行号):
1. CFEBE81B5877:
2. info:
3. header Subject: Test Messages from unknown[10.21.2.166];
4. from=<Test@testserver.com>
5. to=<example@example.com>
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 的普遍建议是使用调试器,开始时放慢速度,一次从左侧移动一个字段。这将使您不会遗漏字段,并确保您在进行过程中对解析感到满意。
我在为我的 elasticsearch 服务器解析特定行数据时遇到问题,以便使其可搜索等。
我在这里尝试做的是让 postfix 记录通过系统的所有消息的主题行。我知道这对于数据记录来说有点灰色地带,但它似乎有效。
为了实现这一点,我编辑了我的后缀文件中的 main.cf 以对主题行执行标头检查并将其记录在 INFO 级别并将其写入邮件日志。
因此,消息的主题行来自 postfix 清理过程,在 kibana 中看起来像这样,一旦解析出来:
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=<Test@testserver.com> to=<example@example.com> proto=ESMTP helo=<testcomputer>
#offset 226,216
tproto ESMTP
tshipper Testserver
tsource /var/log/maillog
ttags _grokparsefailure
tto example@example.com
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}
如您所见,它不想为我解析出主题行。我试图在 postfix/cleanup 模式下进行正确的更改,但它似乎不起作用。我是 grok 模式构造的新手,将不胜感激。
logastash 的 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
}
}
如前面的评论所述,您的模式必须与您的输入相匹配。如果您查看您的输入,它在 SYSLOGBASE 之后有几个部分。 (为便于讨论而添加的行号):
1. CFEBE81B5877:
2. info:
3. header Subject: Test Messages from unknown[10.21.2.166];
4. from=<Test@testserver.com>
5. to=<example@example.com>
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 的普遍建议是使用调试器,开始时放慢速度,一次从左侧移动一个字段。这将使您不会遗漏字段,并确保您在进行过程中对解析感到满意。