]> git.treefish.org Git - logalert.git/blob - src/logalert.py
refactoring
[logalert.git] / src / logalert.py
1 #!/usr/bin/env python3
2
3 import argparse
4 import logging
5 import time
6
7 import misc
8
9 MAX_LINES = 10
10 ALERT_INTERVAL = 86400
11
12 logging.basicConfig(format='[%(asctime)s] %(levelname)s: %(message)s',
13                     level=logging.INFO,
14                     datefmt='%m/%d/%Y %H:%M:%S')
15
16 parser = argparse.ArgumentParser(description='Alert on excessive number of error log lines.')
17 parser.add_argument('logfile', type=str, help='logfile to be watched')
18 parser.add_argument('handler', type=str,
19                     help='alert will be delivered to standard input of handler')
20 parser.add_argument('-s', '--interval-size', type=int, default=600, dest='interval_size',
21                     help='sample interval size in seconds (default: 600)')
22 parser.add_argument('-n', '--num-intervals', type=int, default=6, dest='num_intervals',
23                     help='number of intervals to keep in history (default: 6)')
24
25 args = parser.parse_args()
26
27 kept_times = []
28 lines = []
29 last_slot_time = None
30 error_state = False
31 last_alert_time = 0
32
33 for line in misc.follow_file(args.logfile):
34     time_now = time.time()
35     slot_now = int(time_now) // args.interval_size
36
37     if line != None:
38         if not last_slot_time or slot_now > last_slot_time:
39             kept_times.append(slot_now)
40             last_slot_time = slot_now
41         lines.append(line)
42         if len(lines) > MAX_LINES:
43             lines.pop(0)
44
45     while len(kept_times) > 0 and \
46           kept_times[0] <= slot_now - (args.num_intervals + 1):
47         kept_times.pop(0)
48
49     intervals = [False] * (args.num_intervals + 1)
50     for kept_time in kept_times:
51         intervals[slot_now - kept_time] = True
52
53     logging.debug(intervals)
54
55     if not False in intervals[1:]:
56         if not error_state or time_now - last_alert_time > ALERT_INTERVAL:
57             last_alert_time = time_now
58             misc.feed_handler( args.handler,
59                                misc.create_msg("Log Alert",
60                                                "&#9760;",
61                                                args.logfile,
62                                                "Number of errors exceeded!",
63                                                lines) )
64         if not error_state:
65             logging.warning("Entering error state!")
66             error_state = True
67
68     else:
69         if error_state:
70             logging.info("Leaving error state.")
71             error_state = False