Der Code ist nicht fertig und war mal ein Labor Versuch. Es lassen sich globale und Host Filter setzen wo diese zutreffen werden die Logs in ein extra File geschrieben.
Config file:
#!/usr/bin/env python # -*- coding: utf-8 -*- # Config definition class CFG: def __init__(self): # Path for logfiles self.syslogpath = "/home/mthoma/_dev/syslog/log/" # Listner Port self.port = 3702 # Listner address self.host = "0.0.0.0" # Global Filter self.global_filter = { "filter": [ ".*FOOBAR.*", ".*COFFEE.*" ] } # Host Filter self.host_filter = { "10.201.11.33": { "filter": [ ".*MACFLAP.*", ".*BUBU.*", ] }, }
Syslog Server:
#!/usr/bin/env python # -*- coding: utf-8 -*- # Load config class from config import CFG # Load common classes import re import logging import SocketServer import socket import os # Load configuration file C = CFG() formatter = logging.Formatter('%(message)s') def setup_logger(name, log_file, level=logging.INFO): handler = logging.FileHandler(log_file) handler.setFormatter(formatter) logger = logging.getLogger(name) logger.setLevel(level) logger.addHandler(handler) return logger class SyslogUDPHandler(SocketServer.BaseRequestHandler): def handle(self): data = bytes.decode(self.request[0].strip()) sockets = self.request[1] ip = str(self.client_address[0]) # Try to resolve reverse record via DNS try: name, alias, addresslist = socket.gethostbyaddr(ip) except: name = ip # Set path path = C.syslogpath+name+"/" # Create path if not exist try: os.stat(path) except: os.mkdir(path) logger = setup_logger('normal_log', path+"log") logger.info(str(data)) logger_sp = setup_logger('special_log', path+"spec") if ip in C.host_filter: filters = options['filter'] + C.global_filter['filter'] filter_join = "|".join(filters) if re.match(r"%s" % filter_join, str(data)): logger_sp.info(str(data)) else: filters = C.global_filter['filter'] filter_join = "|".join(filters) if re.match(r"%s" % filter_join, str(data)): logger_sp.info(str(data)) print "%s : " % self.client_address[0], str(data) logging.info(str(data)) if __name__ == "__main__": try: server = SocketServer.UDPServer((C.host,C.port), SyslogUDPHandler) server.serve_forever(poll_interval=0.5) except (IOError, SystemExit): raise except KeyboardInterrupt: print "Crtl+C Pressed. Shutting down."