通过watchdog模块监听文件修改,并实现断点续读
实现功能:
自动监听以当天日期为名的log文件,当修改时可以进行处理,并支持断点续读
#pip3 install watchdog import time,datetime,os,re from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler # #定义类,自动监听文件修改,可以断点续读 class LogHandler(FileSystemEventHandler): def __init__(self, file_path): self.file_path = file_path self.offset = self.load_offset() def load_offset(self): """从 offset 文件中加载上次读取的位置""" if os.path.exists(OFFSET_FILE): with open(OFFSET_FILE, 'r') as f: try: return int(f.read().strip()) except ValueError: print("Offset file is invalid, starting from beginning.") return 0 def save_offset(self, offset): """保存当前读取的位置""" with open(OFFSET_FILE, 'w') as f: f.write(str(offset)) def on_modified(self, event): if event.src_path == self.file_path: # print(f"检测到文件修改: {event.src_path}") try: with open(self.file_path, 'r', encoding='utf-8', errors='ignore') as f: f.seek(self.offset) # 从上次的位置开始读 for line in f: mail_qun = Get_Maillog(line) #调用函数处理每行的内容 if mail_qun: print(mail_qun) self.offset = f.tell() # 更新偏移量 self.save_offset(self.offset) except Exception as e: print(f"读取文件出错: {e}") if __name__ == "__main__": #定义存放日志文件的目录 mail_log_dir = '/data1//fort' OFFSET_FILE = '/data1//fort/offset.txt' today = datetime.datetime.now().strftime('%Y-%m-%d') log_file_name = today + '.log' log_file_path = os.path.join(mail_log_dir,log_file_name) if os.path.exists(log_file_path): # print(log_file_path) event_handler = LogHandler(log_file_path) observer = Observer() observer.schedule(event_handler, path = mail_log_dir, recursive = False) print(f'开始监听文件: {log_file_path}') observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() observer.join() else: print(f'{log_file_path} 不存在')
浙公网安备 33010602011771号