通过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} 不存在')

 

posted on 2025-05-20 16:44  momingliu11  阅读(22)  评论(0)    收藏  举报