2014-02-25 16 views
0

我想建立一個python腳本里grep在我的SMTP服務器低谷進出口日誌文件,並報告總金額的大部分發送域每天,每週和每月。 我很新的python,我正在努力如何實現這一點。HOWTO構建Python腳本來分析進出口的日誌文件,並生成發送域算

相關線在進出口日誌文件通常是這樣的:

Feb 24 00:00:23 smtp1.mail.net exim[5660]: 2014-02-24 00:00:23 1Wuniq-mail-idSo-Fg -> [email protected] 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 -> [email protected] 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 => [email protected] 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 

sysosre模塊應該足以實現這一目標(?)。 我也想使用字典,因爲我想每天在cron中運行腳本。

的主要問題是:我如何用grep侃僅槽相關的線路? Exim記錄了很多,我只想grep包含「=>和 - >」的行。結合以「1W」開頭的uniq maild ID。 另外,對於每日腳本,腳本必須通過日誌文件「尾巴」,並應從最後一次腳本停止解析日誌文件的最後一次位置開始執行。 爲了生成可靠的每日發送域數,這是必要的。

幫助將非常感激。

回答

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包。另請參閱相關問題answered

我假設這是一個腳本,這將意味着你不能「記住」您上次離開它。爲此,您可以在閱讀日誌文件時自行編輯日誌文件,並用獨特的符號標記出您留下的位置。接下來閱讀它時,只能從文件末尾讀到符號。

編輯:糾正timestamp計算

+0

這有助於一大堆,這正是我所需要的輸出。謝謝! –