From: Alexander Schmidt Date: Tue, 6 Oct 2020 19:27:30 +0000 (+0200) Subject: refactoring X-Git-Url: http://git.treefish.org/~alex/logalert.git/commitdiff_plain/066228e2a7b4a1ae397231965d17c25bef2cd461?ds=inline;hp=9bd4e7752ed07286a8e6b43f92c2820192539a5c refactoring --- diff --git a/src/logalert.py b/src/logalert.py index df9de07..e2f02cc 100755 --- a/src/logalert.py +++ b/src/logalert.py @@ -2,59 +2,13 @@ import argparse import logging -import os -import shlex -import subprocess import time +import misc + MAX_LINES = 10 ALERT_INTERVAL = 86400 -def follow(path): - while True: - try: - 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 os.stat(path).st_ino != current_ino or \ - os.stat(path).st_size < f.tell(): - break - else: - time.sleep(1.0) - yield None - else: - yield line.rstrip("\n") - except FileNotFoundError: - time.sleep(1.0) - yield None - -def feed_handler(data): - try: - handler = subprocess.Popen(shlex.split(args.handler), - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - encoding='UTF-8') - out_data, err_data = handler.communicate("%s\n" % data) - if handler.returncode != 0: - logging.warning("Handler exited with non-zero return code %d! (%s)" % - (handler.returncode, err_data)) - except Exception as e: - logging.error("Error feeding handler: %s" % str(e)) - -def create_msg(title, icon, logfile, text, lines): - msg = "%s %s %s" % (title, logfile, icon) - msg += "
%s" % text - msg += "
"
-    for line in lines: msg += line + "\n"
-    msg += "
" - return msg - logging.basicConfig(format='[%(asctime)s] %(levelname)s: %(message)s', level=logging.INFO, datefmt='%m/%d/%Y %H:%M:%S') @@ -76,7 +30,7 @@ last_slot_time = None error_state = False last_alert_time = 0 -for line in follow(args.logfile): +for line in misc.follow_file(args.logfile): time_now = time.time() slot_now = int(time_now) // args.interval_size @@ -101,11 +55,12 @@ for line in follow(args.logfile): 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) ) + misc.feed_handler( args.handler, + misc.create_msg("Log Alert", + "☠", + args.logfile, + "Number of errors exceeded!", + lines) ) if not error_state: logging.warning("Entering error state!") error_state = True diff --git a/src/misc.py b/src/misc.py new file mode 100644 index 0000000..8d8253d --- /dev/null +++ b/src/misc.py @@ -0,0 +1,50 @@ +import logging +import os +import shlex +import subprocess +import time + +def follow_file(path): + while True: + try: + 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 file.") + for line in f: pass + while True: + line = f.readline() + if not line: + if os.stat(path).st_ino != current_ino or \ + os.stat(path).st_size < f.tell(): + break + else: + time.sleep(1.0) + yield None + else: + yield line.rstrip("\n") + except FileNotFoundError: + time.sleep(1.0) + yield None + +def feed_handler(cmd, data): + try: + handler = subprocess.Popen(shlex.split(cmd), + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + encoding='UTF-8') + out_data, err_data = handler.communicate("%s\n" % data) + if handler.returncode != 0: + logging.warning("Handler exited with non-zero return code %d! (%s)" % + (handler.returncode, err_data)) + except Exception as e: + logging.error("Error feeding handler: %s" % str(e)) + +def create_msg(title, icon, logfile, text, lines): + msg = "%s %s %s" % (title, logfile, icon) + msg += "
%s" % text + msg += "
"
+    for line in lines: msg += line + "\n"
+    msg += "
" + return msg