summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Sommerseth <davids@redhat.com>2012-09-16 17:26:13 +0200
committerDavid Sommerseth <davids@redhat.com>2012-09-16 17:26:13 +0200
commitdbaf8d9df54127688b282740aac9ee0d5cf5efbc (patch)
tree5cf0fda6c1d4f0cbbc481b9689ac7209e7e170c7
parent5add7968b5d0b336d944d3d494778e6318c5e646 (diff)
downloadlogactio-dbaf8d9df54127688b282740aac9ee0d5cf5efbc.tar.gz
logactio-dbaf8d9df54127688b282740aac9ee0d5cf5efbc.tar.xz
logactio-dbaf8d9df54127688b282740aac9ee0d5cf5efbc.zip
Added support for multiple reporters per [Logfile:*] and [Rule:*]
This allows multiple reporters to act when it is triggered Signed-off-by: David Sommerseth <davids@redhat.com>
-rw-r--r--LogActio/__init__.py50
1 files changed, 31 insertions, 19 deletions
diff --git a/LogActio/__init__.py b/LogActio/__init__.py
index 0e71af3..3a501ab 100644
--- a/LogActio/__init__.py
+++ b/LogActio/__init__.py
@@ -29,12 +29,12 @@ import ReporterQueue
from LogActio.Reporters import DefaultReporter
class WatcherThread(threading.Thread):
- def __init__(self, logfile, polltime, reporter):
+ def __init__(self, logfile, polltime, reporters):
# This object will watch for changes in one particular log file
self.__rules = []
self.__logfile = logfile
self.__polltime = polltime is not None and int(polltime) or 30
- self.__reporter = reporter
+ self.__reporters = reporters
self.__shutdown = False
threading.Thread.__init__(self)
@@ -55,13 +55,15 @@ class WatcherThread(threading.Thread):
def StartWatcher(self):
- # Start the default reporter module
- self.__reporter._Start()
+ # Start the default reporter modules
+ for rep in self.__reporters:
+ rep._Start()
# Start reporter modules declared in rules
for r in self.__rules:
if r.has_key("reporters") and r["reporters"] is not None:
- r["reporters"]._Start()
+ for rep in r["reporters"]:
+ rep._Start()
# Start the thread with this watcher
self.start()
@@ -99,9 +101,10 @@ class WatcherThread(threading.Thread):
# Send the alert event to be processed, prioritise the
# rule specific reporter over the default reporter
- rep = alert.has_key("reporters") and alert["reporters"] or self.__reporter
- rep.ProcessEvent(self.__logfile, alert["prefix"], info,
- alert["current_count"], alert["threshold"])
+ rep = alert.has_key("reporters") and alert["reporters"] or self.__reporters
+ for r in rep:
+ r.ProcessEvent(self.__logfile, alert["prefix"], info,
+ alert["current_count"], alert["threshold"])
fp.close()
return 0
@@ -112,10 +115,12 @@ class WatcherThread(threading.Thread):
# Shutdown rule specific reporters
for r in self.__rules:
if r.has_key("reporters") and r["reporters"] is not None:
- r["reporters"]._Shutdown()
+ for rep in r["reporters"]:
+ rep._Shutdown()
# Shutdown default reporters
- self.__reporter._Shutdown()
+ for rep in self.__reporters:
+ rep._Shutdown()
class LogActio(object):
@@ -246,20 +251,22 @@ class LogActio(object):
except ConfigParser.NoOptionError:
polltime = None
- # Extract the default reporter to use for this log file
+ # Extract the default reporters to use for this log file
try:
- repname = self.__cfg.get(entry, "reporter")
- reporter = __reporters[repname]
+ defreps = []
+ repnames = self.__cfg.get(entry, "reporters")
+ for repname in [n.strip() for n in repnames.split(",")]:
+ defreps.append(__reporters[repname])
except ConfigParser.NoOptionError:
- reporter = __reporters["Default"]
+ depreps = [__reporters["Default"]]
except KeyError, e:
raise Exception("No reporters are configured as '%s'" % repname)
# Create a new thread which will watch this particular log file
# and will use the configured reporter to handle matching events
- self.__watchthreads.append(WatcherThread(logfile, polltime, reporter))
+ self.__watchthreads.append(WatcherThread(logfile, polltime, defreps))
self.__log(3, "Prepared [%s]: %s (%s) => %s" % (
- logname, logfile, polltime, reporter.GetName()))
+ logname, logfile, polltime, ", ".join([r.GetName() for r in defreps])))
self.__log(1, "Configured log files: %s" % ", ".join(__logfileidx))
@@ -275,8 +282,10 @@ class LogActio(object):
raise Exception("** ERROR ** Logfile '%s' is not configured" % self.__cfg.get(entry, "logfile"))
try:
# Check if this rule has specific reporters confingured
- repname = self.__cfg.get(entry, "reporters")
- reps = __reporters[repname]
+ rulereps = []
+ repnames = self.__cfg.get(entry, "reporters")
+ for repname in [n.strip() for n in repnames.split(",")]:
+ rulereps.append(__reporters[repname])
except ConfigParser.NoOptionError:
# If nothing was found, that's okay
reps = None
@@ -287,7 +296,10 @@ class LogActio(object):
self.__watchthreads[idx].AddRule(rulename,
self.__cfg.get(entry, "regex"),
self.__cfg.get(entry, "threshold"),
- reps)
+ rulereps)
+ if rulereps is not None and len(rulereps) > 0:
+ self.__log(3, "Rule reporters prepared: [%s] => %s" %
+ (rulename, ", ".join([r.GetName() for r in rulereps])))
del __logfileidx