0

我想构建一个 python 脚本,它在我的 smtp 服务器上通过 exim 日志文件进行 greps,并每天、每周和每月报告大多数发送域的总数。我对python很陌生,我正在努力实现这一目标。

exim 日志文件中的相关行通常如下所示:

Feb 24 00:00:23 smtp1.mail.net exim[5660]: 2014-02-24 00:00:23 1Wuniq-mail-idSo-Fg -> someuser@somedomain.com R=mail T=remote_smtp H=smtp.mail.net [000.00.34.17]

Feb 24 00:00:23 smtp1.mail.net exim[5660]: 2014-02-24 00:00:23 1Wuniq-mail-idSo-Fg -> someuser@somedomain.com R=mail T=remote_smtp H=smtp.mail.net [000.00.34.17]

Feb 24 00:00:23 smtp1.mail.net exim[5661]: 2014-02-24 00:00:23 1Wuniq-mail-idSm-1h => someuser@somedomain.com R=mail T=pop_mail_net H=mta.mail.net [000.00.34.6]

Feb 24 00:00:23 smtp1.mail.net exim[5661]: 2014-02-24 00:00:23 1Wuniq-mail-idSm-1h Completed

,sys和模块应该足以实现这一点(?)osre我还想使用字典,因为我想每天在 cron 中运行脚本。

主要问题是:我如何仅通过相关行进行grep?Exim 记录了很多,我只想 grep 包含“=> 和 ->”的行。与以“1W”开头的 uniq maild ID 结合使用。此外,对于每日脚本运行,脚本必须“跟踪”日志文件,并且应该从脚本上次执行时停止解析日志文件的最后一个位置开始。为了生成可靠的每日发送域计数,这是必要的。

帮助将不胜感激。

4

1 回答 1

1

您可以先通过以下方式反向读取文件:

    logFileData = []
    with open( pathToLogFile, "r" ) as logfile:
            logFileData = reversed( logfile.readlines() )

然后,您可以从中获取所需的每个日志文件数据的部分:

    for line in logFileData:
            temp = ""
            if '=>' in line:
                    temp = line.split('=>')
            elif '->' in line:
                    temp = line.split('->')

            if temp:
                    ## Get the first substring after splitting at '->/=>'; 
                    ##   From that substring, get the last substring after splitting at all whitespaces.

                    address = temp[0].split()[-1].strip()
                    timestampParts = temp[0].split()[:3]  #Get each part of the date
                    timestampString = " ".join( timestampParts )

                    ##   Get the last two characters of interest from it.
                    if address.startswith("1W"):
                             pass  #Replace with your functionality here

要解析字符串中的时间,请查看 python dateutil包。另请参阅已回答的相关问题。

我假设这是一个脚本,这意味着您无法“记住”您上次离开它的位置。为此,您可以在阅读日志文件时对其进行编辑,并用唯一符号标记您离开的位置。下次阅读时,仅从文件末尾读取到您的符号。

编辑:更正的timestamp计算

于 2014-02-25T10:24:09.160 回答