diff options
Diffstat (limited to 'LogActio/__init__.py')
-rw-r--r-- | LogActio/__init__.py | 50 |
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 |