这些日志解析Perl做了什么,我怎么能想出可能有用的东西呢?

时间:2012-03-12 02:11:07

标签: perl postfix-mta dovecot

这个问题出现在pop-before-smtp / Postfix / Dovecot的上下文中,但是如果我知道Perl字符串解析,我可以自己想出答案。但是,我迷路了,我甚至不知道确切的问题。即:

我们一直在使用Postfix很长一段时间,并且有点迷上它。现在我们需要“进入现代时代”并让人们发送来自我们的SMTP服务器的电子邮件,即使它们在我们的网络之外。因此,在完成这项工作的任务中,我发现了pop-before-smtp。

你可以找到它here

所以,我已经完成所有配置但是测试失败了。我使用方向here来解决问题,并确定试图解析日志的Perl似乎不正确。我们使用Dovecot作为我们的IMAP / POP服务器,配置文件中有三个选项。以下是配置文件的摘录,显示了三组:

# For Dovecot POP3/IMAP when using syslog.
#$pat = '^[LOGTIME] \S+ (?:dovecot: )?(?:imap|pop3)-login: ' .
#    'Login: .*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]';
#$out_pat = '^[LOGTIME] \S+ (?:dovecot: )?(?:imap|pop3)-login: ' .
#    'Disconnected.*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]';

# For Dovecot POP3/IMAP when it does its own logging.
##$logtime_pat = '(\d\d\d\d-\d+-\d+ \d+:\d+:\d+)';
#$pat = '^dovecot: [LOGTIME] Info: (?:imap|pop3)-login: ' .
#    'Login: .+? rip=[:f]*(\d+\.\d+\.\d+\.\d+),';
#$out_pat = '^dovecot: [LOGTIME] Info: (?:imap|pop3)-login: ' .
#    'Disconnected.*? rip=[:f]*(\d+\.\d+\.\d+\.\d+),';

# For older Dovecot POP3/IMAP when it does its own logging.
#$pat = '^(?:imap|pop3)-login: [LOGTIME] Info: ' .
#    'Login: \S+ \[[:f]*(\d+\.\d+\.\d+\.\d+)\]';
#$out_pat = '^(?:imap|pop3)-login: [LOGTIME] Info: ' .
#    'Disconnected.*? \[[:f]*(\d+\.\d+\.\d+\.\d+)\]';

一个应该取消注释那些适用的,但是,它们都不起作用。

我猜测'pat'是登录模式,out-pat是退出或断开连接的模式。

实际的日志记录格式明显不同于这三种格式,但它们很接近。以下是一对示例:

Mar 11 17:53:55 imap-login: Info: Login: user=<username>, method=PLAIN, rip=208.54.4.205, lip=192.168.1.1, TLS

Mar 11 17:59:10 IMAP(username): Info: Disconnected: Logged out bytes=352/43743

当使用POP时,'imap-login'被'pop-login'取代,并且在注销时,'POP'取代'IMAP' - 为什么大写的变化我不能说!

导入和数据是:时间戳,用户名,以及登录时“远程”ip(“rip”)。

如果有足够的时间,我可以拼凑一些有效的东西,但由于我实际上并不了解Perl,所以这很难。请帮我写一些新规则来解析我们的Dovecot软件包使用的日志输出。

1 个答案:

答案 0 :(得分:1)

Perl正则表达式的(:?..部分要求集群,但不是捕获;这允许整个组作为组匹配或忽略,而不影响捕获组编号;所有行都准确捕获一个字段,允许IP。 (这有点奇怪,我可能已经预期用户名和IP,但从长远来看这可能会更容易。)

# For Dovecot POP3/IMAP when using syslog.
$pat = '^[LOGTIME] \S+ (?:imap|pop3)-login: Info: ' .
    'Login: .*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]';
# not necessary? see comment header START OF PATTERNS
# $out_pat = '^[LOGTIME] \S+ (?:IMAP|POP3)\(\S+\): Info: ' .
#    'Disconnected.*';

我删除了dovecot件,因为它们不在你的输入中。我在这两行添加了Info:。我已将$out_pat修改为使用IMAP(username)而不是原来的imap-login。 (如果用户名有空格,\S+的使用将会中断。由于这个假设是在文件的其他地方进行的,我希望它没问题。)

由于不再需要为注销行捕获任何IP地址,因此最好不定义$out_pat - START OF PATTERNS注释块包含短语如果您选择的条目也提供$out_pat,您还应该取消注释该变量,这样我们就可以跟踪仍然连接到服务器的用户(例如,Thunderbird缓存打开的IMAP连接)。 / em>的

我没有对此进行过测试,但我对它有很好的感受。