Python watchdog 文件监控

Python watchdog 文件监控

我尝试用watchdog开发一个文件监控系统
这是我的源代码

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from time import sleep


class EventProcessing (FileSystemEventHandler) :
    # 事件处理类
    
    def on_moved (self, event) -> '文件移动触发' :
        print("文件移动触发")
        print(event)

    def on_created (self, event) -> '文件创建触发' :
        print("文件创建触发")
        print(event)

    def on_deleted (self, event) -> '文件删除触发' :
        print("文件删除触发")
        print(event)

    def on_modified (self, event) -> '文件编辑触发' :
        print("文件编辑触发")
        print(event)
    
a = Observer()
# 观察者对象

b = EventProcessing()
# 事件处理对象

a.schedule(b, 'C:\\Users\\YWJ\\Desktop',True)
# 观察者绑定事件处理

a.start()
# 启动观察者

while True : pass

他已经具备基本的文件监控功能
现在我想添加一个功能 即:

在捕捉到文件创建或删除事件时
记录或获取创建文件或删除文件的发起程序

例如:
a.exe创建了一个文件"a.txt"监控系统能捕捉到并且能知道是"a.exe"创建的
注意:是在文件创建时记录!


我的想法
通过Google我了解到Windows中开启文件审核可以通过读取Windows文件日志获取创建或删除程序
But
Windows的日志记录和Python watchdog 存在时间差 Python watchdog 捕捉到事件后Windows日志需要间隔大约30多秒才会记录 这是程序不允许的 于是我尝试Google Python watchdog 能否直接获取到创建程序 But 并没有找到有用的资料

求各位能为我解答 Python watchdog 能否直接获取到创建程序 或者 解决Windows日志的时间差
如果各位有更好的办法希望您能和我分享

感谢!

可以使用Python的psutil库来获取当前正在运行的进程信息,然后将创建文件的进程ID与进程信息匹配,最终得到创建文件的发起程序。具体实现代码如下:

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from time import sleep
import psutil


class EventProcessing(FileSystemEventHandler):
    # 事件处理类

    def on_moved(self, event) -> '文件移动触发':
        print("文件移动触发")
        print(event)

    def on_created(self, event) -> '文件创建触发':
        print("文件创建触发")
        print(event)
        process_name = self.get_process_name()
        print(f"创建文件的进程:{process_name}")

    def on_deleted(self, event) -> '文件删除触发':
        print("文件删除触发")
        print(event)
        process_name = self.get_process_name()
        print(f"删除文件的进程:{process_name}")

    def on_modified(self, event) -> '文件编辑触发':
        print("文件编辑触发")
        print(event)

    def get_process_name(self):
        process_id = psutil.Process(event.pid).ppid()
        process_name = psutil.Process(process_id).name()
        return process_name


if __name__ == '__main__':
    a = Observer()
    # 观察者对象

    b = EventProcessing()
    # 事件处理对象

    a.schedule(b, 'C:\\Users\\YWJ\\Desktop', True)
    # 观察者绑定事件处理

    a.start()
    # 启动观察者

    while True:
        pass

在on_created和on_deleted方法中,调用get_process_name方法获取创建/删除文件的进程名,并进行输出。方法中首先使用event.pid获取到创建/删除文件的进程ID,然后使用psutil库获取该进程的父进程ID,最终通过父进程ID获取到进程名。