X-Git-Url: http://git.treefish.org/~alex/logalert.git/blobdiff_plain/6b726fdf122e07843cbaafd2f2ea76338a5878da..9bd4e7752ed07286a8e6b43f92c2820192539a5c:/src/logalert.py?ds=inline diff --git a/src/logalert.py b/src/logalert.py index d240f44..df9de07 100755 --- a/src/logalert.py +++ b/src/logalert.py @@ -7,20 +7,22 @@ import shlex import subprocess import time -from line import Line - MAX_LINES = 10 +ALERT_INTERVAL = 86400 -def follow(filename): +def follow(path): while True: try: - with open(filename, "r") as f: + fd = os.open(path, os.O_RDONLY) + current_ino = os.fstat(fd).st_ino + with os.fdopen(fd, "r") as f: logging.info("Re-attached to log file.") for line in f: pass while True: line = f.readline() if not line: - if not os.path.exists(filename): + if os.stat(path).st_ino != current_ino or \ + os.stat(path).st_size < f.tell(): break else: time.sleep(1.0) @@ -70,45 +72,45 @@ args = parser.parse_args() kept_times = [] lines = [] -last_time = None +last_slot_time = None error_state = False +last_alert_time = 0 for line in follow(args.logfile): - now = int(time.time()) // args.interval_size + time_now = time.time() + slot_now = int(time_now) // args.interval_size if line != None: - if not last_time or now > last_time: - kept_times.append(now) - last_time = now + if not last_slot_time or slot_now > last_slot_time: + kept_times.append(slot_now) + last_slot_time = slot_now lines.append(line) if len(lines) > MAX_LINES: lines.pop(0) while len(kept_times) > 0 and \ - kept_times[0] <= now - args.num_intervals: + kept_times[0] <= slot_now - (args.num_intervals + 1): kept_times.pop(0) - intervals = [False] * args.num_intervals + intervals = [False] * (args.num_intervals + 1) for kept_time in kept_times: - intervals[now - kept_time] = True + intervals[slot_now - kept_time] = True logging.debug(intervals) - if not False in intervals: - if not error_state: - logging.warning("Entering error state!") - error_state = True + if not False in intervals[1:]: + if not error_state or time_now - last_alert_time > ALERT_INTERVAL: + last_alert_time = time_now feed_handler( create_msg("Log Alert", "☠", args.logfile, "Number of errors exceeded!", lines) ) + if not error_state: + logging.warning("Entering error state!") + error_state = True + else: if error_state: logging.info("Leaving error state.") error_state = False - feed_handler( create_msg("Log Un-Alert", - "🌞", - args.logfile, - "Log is back to normal.", - lines) )