2018年10月3日 星期三

Watchdog 監控系統文件

Watchdog 監控系統文件

Written with StackEdit.

watchdog是用於監控檔案事件的Python API庫。受監控的檔案事件常見的有四種,分別為:移動、新增、移除、修改。當watchdog偵測到這四個事件時,會呼叫相應的函數進行反應。

下面是官方網站上提供的範例:

import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S')
    path = sys.argv[1] if len(sys.argv) > 1 else '.'
    event_handler = LoggingEventHandler()
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

watchdog的運作流程是observer開啟一個線程對檔案系統進行監控,當偵測到檔案事件時,將事件的旗標傳入event_handler,由event_handler進行反應。

在上面的範例中,由LoggingEventHandler作為event_handler。由LoggingEventHandler的原碼可以看到,它繼承自FileSystemEventHandler,並重載了FileSystemEventHandleron_movedon_createdon_deletedon_modified四個方法,並使用logging庫進行等級為INFO的記錄。

class LoggingEventHandler(FileSystemEventHandler):
    """Logs all the events captured."""

    def on_moved(self, event):
        super(LoggingEventHandler, self).on_moved(event)

        what = 'directory' if event.is_directory else 'file'
        logging.info("Moved %s: from %s to %s", what, event.src_path,
                     event.dest_path)

    def on_created(self, event):
        super(LoggingEventHandler, self).on_created(event)

        what = 'directory' if event.is_directory else 'file'
        logging.info("Created %s: %s", what, event.src_path)

    def on_deleted(self, event):
        super(LoggingEventHandler, self).on_deleted(event)

        what = 'directory' if event.is_directory else 'file'
        logging.info("Deleted %s: %s", what, event.src_path)

    def on_modified(self, event):
        super(LoggingEventHandler, self).on_modified(event)

        what = 'directory' if event.is_directory else 'file'
        logging.info("Modified %s: %s", what, event.src_path)

我們可以按照同樣的邏輯撰寫自己的event_handler

class MyEventHandler(FileSystemEventHandler):
    """Logs all the events captured."""

    def on_created(self, event):
        super(LoggingEventHandler, self).on_created(event)

        what = 'directory' if event.is_directory else 'file'
        logging.warning("Created %s: %s by ", what, event.src_path)

這樣就變更為在WARING層級才會記錄新增事件,其他類別的事件都不處理。

除此之外,也可以進行其他處置,例如發現有目錄下有新增檔案後(如圖片),呼叫其他程式對其進行壓縮等等…

Reference

Watchdog
Watchdog github

沒有留言:

張貼留言