import os import json import logging import re name = '日誌文件名' path = '日誌路徑' # 拼接要過濾日誌文件的路徑 file_path = os.path.join(path, name) # 拼接要輸出日誌文件的路徑 LogPath = os.path.join(path, "輸出日誌名") # 日誌輸出等級(DEBUG,INFO,ERROR...)如果需要修改日誌格式,加format='%(message)s'就可以改成沒有info:root logging.basicConfig(filename=LogPath, level=logging.DEBUG) # 清空日誌文件內容 file = open(LogPath, 'w').close() # 輸入json格式自定義類型 class Employee(object): def __init__(self, SYS_NO, O_TIME, ACTION, LOG_TYPE, RESULT, SPENT_TIME, ERROR_MSG): self.SYS_NO = SYS_NO self.O_TIME = O_TIME self.ACTION = ACTION self.LOG_TYPE = LOG_TYPE self.RESULT = RESULT self.SPENT_TIME = SPENT_TIME self.ERROR_MSG = ERROR_MSG def obj_json(self, obj_instance): return { 'SYS_NO': obj_instance.SYS_NO, 'O_TIME': obj_instance.O_TIME, 'ACTION': obj_instance.ACTION, 'LOG_TYPE': obj_instance.LOG_TYPE, 'RESULT': obj_instance.RESULT, 'SPENT_TIME': obj_instance.SPENT_TIME, 'ERROR_MSG': obj_instance.ERROR_MSG, } # 讀取日誌文件,然後寫入err_log文件 def read_log(url, keyword): with open(file_path, 'r+', encoding='utf-8') as f: count = 0 for line in f: # 如果需要讀取行號數字,改成 for (num,line) in enumerate(f): 這裏就將行號獲取到:num,需要展示的話,在自定義json中加入NUM對應的字段 if keyword in line: # 輸出日誌切割,多符號切分 test1 = re.split(',| ', line) time = test1[0] + ' ' + test1[1] + ':' + test1[2] sy_no = None act = None log_type = test1[3] res = test1[4] spent_time = None # error_msg = test1[5] + '' +test1[6]+ '' +test1[7]+ '' +test1[8] # 判斷字段長度,防止報錯,也可以try...except... if len(test1) <= 8: error_msg = os.path.join(test1[5], test1[6], test1[7]) else: error_msg = os.path.join(test1[5], test1[6], test1[7], test1[8]) # 調用函數,傳入對應字段 emp = Employee(sy_no, time, act, log_type, res, spent_time, error_msg) # 序列化轉換爲json格式 data = json.dumps(emp, default=emp.obj_json, ensure_ascii=False) print(data) # 日誌輸出 logging.info(data) count += line.count(keyword) return count sum = 0 num = read_log(file_path, 'ERROR') sum += num print('關鍵字總個數: ' + str(sum))