簡體   English   中英

如何從使用Python修改的日志文件的最新信息中獲取信息?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM