今天有個工作,要從一堆 log 裡面找出一些資料,

想想很麻煩,寫個 python 程式來讀 log 比較快...

不過因為需要每行 log 的時間,所以要讀入以下 log 最前面的時間資料:

2016-03-31 05:37:14,623 [DEBUG] Added task 16976
2016-03-31 05:37:15,177 [ INFO] Set proxy to 172.1.1.1

 

嗯... 用正規表示法將時間的部分抓出來是沒有問題的:

REGEX_LOG_TIME = re.compile("^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}),(\d{3}) ")

matched = REGEX_LOG_TIME.match(line)

 

但要怎麼把它轉成 python 看的懂的時間值呢?

找了一下,原來 python 的 time 模組裡,有個 strptime() 可以用,

只要依據時間字串的格式,指定正確的格式化字串,就可以幫忙解析了:

>>> time.strptime("2016-03-31 05:37:14", "%Y-%m-%d %H:%M:%S")
time.struct_time(tm_year=2016, tm_mon=3, tm_mday=31, tm_hour=5, tm_min=37, tm_sec=14, tm_wday=3, tm_yday=91, tm_isdst=-1)

 

不過 strptime() 裡的秒數精度只到整數,逗號後面的三位小數是沒辦法讀的...

只好用正規表示法將最後面三位小數另外讀取出來,

並且用 time.mktime() 先將剛剛用 strptime() 轉出來的 time.struct_time 物件轉成一個整數值,

再將它加上後面的三位小數:

REGEX_LOG_TIME = re.compile("^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}),(\d{3}) ")

matched = REGEX_LOG_TIME.match(line)
log_time = time.mktime(time.strptime(matched.group(1), "%Y-%m-%d %H:%M:%S")) + int(matched.group(2))/1000.0

 

有了這個 log_time 之後,想要計算特定 log 行的差距時間就很容易囉~^^

 

文章標籤
創作者介紹

亂打一通的心情日記

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()