Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

watchdog monitoring file for changes

I have a need to watch a log file for changes. After looking through stackoverflow questions, I see people recommending watchdog. So I'm trying to test, and am not sure where to add the code for when files change:

import time from watchdog.observers import Observer from watchdog.events import LoggingEventHandler  if __name__ == "__main__":     event_handler = LoggingEventHandler()     observer = Observer()     observer.schedule(event_handler, path='.', recursive=False)     observer.start()     try:         while True:             time.sleep(1)         else:             print "got it"     except KeyboardInterrupt:         observer.stop()     observer.join() 

Where do I add the "got it" — in the while loop if the files have been added/changed?

like image 929
Cmag Avatar asked Sep 03 '13 18:09

Cmag


2 Answers

Instead of LoggingEventHandler define your handler:

#!/usr/bin/python import time from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler   class MyHandler(FileSystemEventHandler):     def on_modified(self, event):         print(f'event type: {event.event_type}  path : {event.src_path}')   if __name__ == "__main__":     event_handler = MyHandler()     observer = Observer()     observer.schedule(event_handler, path='/data/', recursive=False)     observer.start()      try:         while True:             time.sleep(1)     except KeyboardInterrupt:         observer.stop()     observer.join() 

on_modified is called when a file or directory is modified.

like image 100
alecxe Avatar answered Sep 25 '22 11:09

alecxe


Here's a snippet to prevent it running twice as others have commented in @alecxe answer:

from datetime import datetime, timedelta  class MyHandler(FileSystemEventHandler):     def __init__(self):         self.last_modified = datetime.now()      def on_modified(self, event):         if datetime.now() - self.last_modified < timedelta(seconds=1):             return         else:             self.last_modified = datetime.now()         print(f'Event type: {event.event_type}  path : {event.src_path}')         print(event.is_directory) # This attribute is also available 
like image 31
run_the_race Avatar answered Sep 24 '22 11:09

run_the_race