2016-06-16 5 views
0

と一致していません:datetime.datetimeの形式は は基本的にスクリプトの目的は、私がログファイルに日付と時刻を比較するには以下のスクリプトを作成した

がログ・ファイルを通過します、それが比較されます現在のタイムスタンプを持つログ行の日付。現在の時刻の1時間前のログ行があれば、その行が表示されます。

サンプルログラインは: 10.x.x.x - - [16/6月/ 2016:09:28:58 -0300] "POST/XXXXX HTTP/1.1" 200 444 10.x.x.x. - - [16/6月/ 2016:09:29:02 -0300] "POST/xxxxxはHTTP/1.1" 200 1483

私は取得していますエラーは次のとおりです。

Current Time 2016-06-16 09:46:55.887691 
LastHour 2016-06-16 08:46:55.887701 
Traceback (most recent call last): 
    File "log.py", line 41, in <module> 
    log_date = datetime.datetime.strptime(match.group(2).rstrip(), "%d/%b/%Y:%H:%M").replace(year=datetime.date.today().year) 
    File "/usr/lib/python2.7/_strptime.py", line 325, in _strptime 
    (data_string, format)) 
ValueError: time data '0/Apr/2016:00:00' does not match format '%d/%b/%Y:%H:%M' 


import re 
import os 
import subprocess 
import os 
import datetime 

LOG_FILE="access_log" 

#xxxxxxxx - - [26/Apr/2016:14:38:52 -0300] "xxxxxxx HTTP/1.1" 200 357 

get_date = re.compile('(.*)([0-9]+/[A-Z-a-z]+/[0-9]+:[0-9]+:[0-9]+)(.*)') 


current_time = datetime.datetime.now() 
lastHourTime = datetime.datetime.now() - datetime.timedelta(hours = 1) 

print ('Current Time %s' % current_time) 
print ('LastHour %s' %lastHourTime) 


def _read_log(): 

     with open (LOG_FILE,'r')as f: 
       content=f.readlines() 
     return content 



if __name__ == '__main__': 
     log_file=_read_log() 

     for line in log_file: 
       #GEt the Date only from the log file Feb 7 07:33:19 
       match=re.search(get_date,line) 
       if match: 
        #Capture only the date field so taht we can compare iet with (current_time and lastHourTime. 
        #log_date1= match.group(2) 
        #print log_date1 
        log_date = datetime.datetime.strptime(match.group(2).rstrip(), "%d/%b/%Y:%H:%M").replace(year=datetime.date.today().year) 

        #print ('Log Date %s' %log_date) 
        #Check if log_date is greater then lastHourTime and less then current_time 
        if log_date < current_time and log_date > lastHourTime : 
         print "Matching" 
         print line 
        else: 
         print "Not Matching" 
         print line 

+0

私はあなたが正しく日付を読んだとは思いません。 '' 0/Apr/2016:00:00 ''に変換しようとしている文字列を見ると、これには1日がないことがわかります(エラーは '0'です)。 。 – nbryans

答えて

0

問題はあなたの正規表現にあります。

(コメント付きコードの例では)26/Apr/2016:14:38をキャプチャする代わりに、6/Apr/2016:14:38をキャプチャします。ご覧のとおり、この日が10,20または30の場合は例外が発生し、それ以外の場合はバグが発生します。

([0-9]+/[A-Z-a-z]+/[0-9]+:[0-9]+:[0-9]+)に正規表現を簡略化し、match.group(2)match.group(1)に変更することができます。

簡単な例:

import re 
import datetime 

get_date = re.compile(r'([0-9]+/[A-Z-a-z]+/[0-9]+:[0-9]+:[0-9]+)') 

line = 'xxxxxxxx - - [26/Apr/2016:14:38:52 -0300] "xxxxxxx HTTP/1.1" 200 357' 

match = re.search(get_date, line) 

if match: 
    log_date = datetime.datetime.strptime(match.group(0).rstrip(), "%d/%b/%Y:%H:%M").replace(
       year=datetime.date.today().year) 
    print log_date 
    >> 2016-04-26 14:38:00 
関連する問題