[英]How do I get Information from log file's last modified using Python?
我是Python的新手,我試圖創建一個腳本來遍歷我的所有日常日志文件以檢查錯誤。
我可以打開文件,打印上次修改日志文件的時間,並打印出日志文件中的所有錯誤。
但是,這些日志中包含過去三年的每日信息。 我希望只能從日志的最后修改日期開始讀取日志的部分(而不是過去三年中的所有錯誤,我只希望最后一天的錯誤。)
到目前為止,這是我的腳本的內容:
import sys, string, os, time
from stat import *
from datetime import datetime
now = datetime.now()
f3 = 'C:\Path\filename.txt'
seconds = os.path.getmtime(f3)
print "Last Date Ran: ", time.strftime('%m/%d/%Y %H:%M:%S' , time.localtime(seconds))
for line in open(f3 , 'r'):
if 'error' in line:
print ">>> " , line
elif 'Error' in line:
print ">>> " , line
elif 'ERROR' in line:
print ">>> " , line
有什么辦法嗎? 我搜索過很多東西,但沒有找到解決我問題的答案。 請幫忙。
簡短的回答,不。 更長的答案是,您要么必須進行大量浪費的解析,要么必須在文件外部跟蹤一些數據。 您可以遍歷整個文件,解析日志消息的時間戳,然后僅在給定時間后打印它們。 盡管對於具有3年數據的文件,最好保持跟蹤腳本讀取的最后一行,然后在每次打開文件以每天對其進行解析時都設法找到該行。 如果您可以訪問此過程中的相關部分,則另一種方法是修改日志記錄機制。 您可以將消息復制到每次腳本運行時刷新的第二個文件中,或者基本上通過第二個文件緩沖日志記錄,並由腳本負責將日志歸檔到歷史文件。
如果您可以提供更多信息,例如日志文件的格式,那將是可能的。
查看方法datetime.datetime.strptime
。 在那里您將找到所需的一切。
例如
import os.path
from datetime import datetime
filename = "my.log"
def log_entry_is_interesting(line, reference_time):
date_str = line.split()[0]
date = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
return timedelta(current_datetime, date).days > reference_time:
last_time_opened = os.path.getmtime(filename)
with open(filename) as f:
for line in filter(lambda x: log_entry_is_interesting(x, last_time_opened), f):
do_something()
我使用filter()
方法。 它在Python 3中作為生成器實現,但在Python 2.x中未實現。 如果您使用2.x,我肯定會使用itertools
-module中的ifilter
。
如果要從上次運行腳本時得到錯誤,請嘗試將日志文件的上次讀取位置存儲在另一個文件中,並在下次讀取日志文件時查找到該位置。
如果文件中的行按日期排序(對於僅追加日志來說是合理的),那么您可以按相反的順序讀取文件( tac
實用程序 -如果您的系統上不可用,則查找或實現Python版本)如果日期過長,則停止閱讀:
# ..
if 'error' in line.lower():
if getdate(line) < today:
break # stop processing
您可以使用搜索功能到達文件末尾,並通過搜索換行符或其他方式找出最后日期。 找到后,您可以進行相應的操作。 我寫了下面的腳本,以找出每個文件的最后日期。 首先使用此功能此功能查找給定日志文件中最后輸入的日期。 要發現它是從文件末尾開始的,請繼續向后移動兩個字符,並檢查下一個字符是否為換行符。 當有換行符時,它將讀取前10個字符。 但是,如果日志中有其他服務的例外情況,則行首可能不包含日期戳。 因此,在最后一行不包含日期戳的情況下,我們使用tryexcept循環進一步迭代。
list= glob.glob("DebugLogFile.log*")
start_time = time.time()
def end_date(file):
count=0;
with open(file, "rb") as f:
first = f.readline()
# Read the first line.
`enter code here`f.seek(-2, os.SEEK_END)
#print f.tell() # Jump to the second last byte.
#print f.read(1)
flag=True;
while (flag) :
try :
#print f.tell()
f.seek(-2, os.SEEK_CUR)
while f.read(1) != b"\n": # Until EOL is found...
try:
f.seek(-2, os.SEEK_CUR)
#print f.tell()
except:
f.seek(0,os.SEEK_SET)
print "test"
break
#Remembering the current pointer in case we have to re-evaluate the date in case of exception
last_pos = f.tell()
last = f.readline()
date=last[:10]
datetime.datetime.strptime(date, '%Y-%m-%d').date()
flag=False
return datetime.datetime.strptime(date, '%Y-%m-%d').date()
except Exception, err_msg:
f.seek(last_pos)
def threshold(file):
base_date=end_date(file)
print("Base date is ", base_date)
print("Computing the threshold.......")
#convert the string to date object
#base_date_ob=datetime.datetime.strptime(base_date, '%Y-%m-%d').date()
threshold=base_date-timedelta(days=14)
return threshold
if __name__ == "__main__":
thresh=threshold("DebugLogFile.log")
print thresh
#list =['DebugLogFile.log.100']
#print list
for file in list :
tmp=end_date(file)
if(tmp>=thresh):
print ("Process file :", file, "Which has end date as ", tmp)
else:
print ("Do Not Process file :", file, "Which has end date as ", tmp)
time=time.time()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.