【问题标题】:What are these lines of log-parsing Perl doing and how can I come up with something that might work?这些日志解析 Perl 的行是做什么的,我怎样才能想出一些可行的方法?
【发布时间】:2012-03-28 11:46:47
【问题描述】:

这个问题出现在 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 包一起使用的日志记录输出。

【问题讨论】:

  • 您的问题是什么?也请仔细阅读并接受你们过去的一些问题。
  • FWIW,Perl 不应被视为首字母缩略词。

标签: perl postfix-mta dovecot


【解决方案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 注释块包含短语 If您选择的条目还提供了$out_pat,您也应该取消注释该变量,这样我们就可以跟踪仍然连接到服务器的用户(例如,Thunderbird 缓存打开的 IMAP 连接)。

我没有对此进行测试,但我对此感觉良好。

【讨论】:

  • 谢谢。不幸的是,它似乎不起作用。不过,我越来越近了。我认为它认为它只需要 IP 的原因是因为断开连接 (out_pat) 似乎正在寻找匹配的 IP 地址,但它不会得到。我认为这意味着它不会真正正确地工作。 ...除了我必须做的所有其他编程之外,我真的没有时间成为一名 PERL 程序员!但似乎现在可能是时候了。仅解决此问题的任何指针(获取用户名和IP,然后匹配注销)-我需要学习的最小值等? Tnx。
  • 啊废话,我觉得这似乎太容易了。将此归结为在发布软件之前始终运行测试。您可以修改dovecot 以强制它在注销时也发出IP 地址吗? (请注意,最坏的情况可能并不算太糟糕——毕竟,有人确实合法地使用了该 IP 地址,如果您的某个用户使用该 IP 地址并不重要是僵尸,你会收到五到十分钟的垃圾邮件或几个小时的垃圾邮件,无论哪种方式,你都可能“很快”注意到它。)
  • 我认为不必太担心它,因为它有一个可配置的超时时间,而且它只会在客户端使用的特定 IP 上打开垃圾邮件,所以它是安全的非常高。 ...现在,我想弄清楚为什么您的代码不起作用! -smile- 后备计划可能是更改 Dovecot 的日志记录特性,或者用不同的 IMAP 服务器替换 Dovecot,尽管我并不急于制定新的密码身份验证...
  • 我已将$out_pat 更新为应该匹配的规则——但由于没有捕获任何内容,它可能仍然失败。但是尝试定义$out_pat,我不确定是否有必要。
猜你喜欢
  • 1970-01-01
  • 2021-08-31
  • 2018-03-26
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 2021-09-17
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多