diff --git a/warden3/warden_server/warden_server.py b/warden3/warden_server/warden_server.py
index 21adb83ad7a5ac9cf329e5b44354667d5bb927e1..736a437e24485a84620184c7b6c09fcb1ef21108 100755
--- a/warden3/warden_server/warden_server.py
+++ b/warden3/warden_server/warden_server.py
@@ -159,6 +159,7 @@ def StreamLogger(stream=sys.stderr, level=logging.INFO):
     fhand.setFormatter(fform)
     logger = get_clean_root_logger(level)
     logger.addHandler(fhand)
+    return logger
 
 
 
@@ -192,6 +193,7 @@ def FileLogger(req, filename, level=logging.INFO):
     logger.addFilter(ffilt)
     logger.addHandler(fhand)
     logging.info("Initialized FileLogger(req=%s, filename=\"%s\", level=\"%d\")" % (type(req).__name__, filename, level))
+    return logger
 
 
 
@@ -261,11 +263,12 @@ class Request(Object):
 
 
 
-class ObjectReq(Object):
+class ObjectBase(Object):
 
-    def __init__(self, req):
+    def __init__(self, req, log):
         Object.__init__(self)
         self.req = req
+        self.log = log
 
 
     def __str__(self):
@@ -273,10 +276,10 @@ class ObjectReq(Object):
 
 
 
-class PlainAuthenticator(ObjectReq):
+class PlainAuthenticator(ObjectBase):
 
-    def __init__(self, req, db):
-        ObjectReq.__init__(self, req)
+    def __init__(self, req, log, db):
+        ObjectBase.__init__(self, req, log)
         self.db = db
 
 
@@ -292,17 +295,17 @@ class PlainAuthenticator(ObjectReq):
         client = self.db.get_client_by_name(hostnames, name, secret)
 
         if not client:
-            logging.getLogger(__name__).info("authenticate: client not found by name: \"%s\", secret: %s, hostnames: %s" % (
+            self.log.info("authenticate: client not found by name: \"%s\", secret: %s, hostnames: %s" % (
                 name, secret, str(hostnames)))
             return None
 
         # Clients with 'secret' set must get authenticated by it.
         # No secret turns secret auth off for this particular client.
         if client.secret is not None and secret is None:
-            logging.getLogger(__name__).info("authenticate: missing secret argument")
+            self.log.info("authenticate: missing secret argument")
             return None
 
-        logging.getLogger(__name__).info("authenticate: %s" % str(client))
+        self.log.info("authenticate: %s" % str(client))
 
         # These args are not for handler
         args.pop("client", None)
@@ -315,19 +318,19 @@ class PlainAuthenticator(ObjectReq):
     def authorize(self, env, client, path, method):
         if method.debug:
             if not client.debug:
-                logging.getLogger(__name__).info("authorize: failed, client does not have debug enabled")
+                self.log.info("authorize: failed, client does not have debug enabled")
                 return None
             return client
 
         if method.read:
             if not client.read:
-                logging.getLogger(__name__).info("authorize: failed, client does not have read enabled")
+                self.log.info("authorize: failed, client does not have read enabled")
                 return None
             return client
 
         if method.write:
             if not (client.write or client.test):
-                logging.getLogger(__name__).info("authorize: failed, client is not allowed to write or test")
+                self.log.info("authorize: failed, client is not allowed to write or test")
                 return None
 
         return client
@@ -387,10 +390,10 @@ class X509NameAuthenticator(PlainAuthenticator):
 
 class X509MixMatchAuthenticator(PlainAuthenticator):
 
-    def __init__(self, req, db):
-        PlainAuthenticator.__init__(self, req, db)
-        self.hostname_auth = X509Authenticator(req, db)
-        self.name_auth = X509Authenticator(req, db)
+    def __init__(self, req, log, db):
+        PlainAuthenticator.__init__(self, req, log, db)
+        self.hostname_auth = X509Authenticator(req, log, db)
+        self.name_auth = X509Authenticator(req, log, db)
 
 
     def authenticate(self, env, args):
@@ -420,10 +423,10 @@ class X509MixMatchAuthenticator(PlainAuthenticator):
         return auth.authenticate(self, env, args)
 
 
-class NoValidator(ObjectReq):
+class NoValidator(ObjectBase):
 
-    def __init__(self, req):
-        ObjectReq.__init__(self, req)
+    def __init__(self, req, log):
+        ObjectBase.__init__(self, req, log)
 
 
     def __str__(self):
@@ -436,8 +439,8 @@ class NoValidator(ObjectReq):
 
 class JSONSchemaValidator(NoValidator):
 
-    def __init__(self, req, filename=None):
-        NoValidator.__init__(self, req)
+    def __init__(self, req, log, filename=None):
+        NoValidator.__init__(self, req, log)
         self.path = filename or path.join(path.dirname(__file__), "idea.schema")
         with open(self.path) as f:
             self.schema = json.load(f)
@@ -469,11 +472,11 @@ class JSONSchemaValidator(NoValidator):
 
 
 
-class MySQL(ObjectReq):
+class MySQL(ObjectBase):
 
-    def __init__(self, req, host, user, password, dbname, port, retry_count,
+    def __init__(self, req, log, host, user, password, dbname, port, retry_count,
             retry_pause, event_size_limit, catmap_filename, tagmap_filename):
-        ObjectReq.__init__(self, req)
+        ObjectBase.__init__(self, req, log)
         self.host = host
         self.user = user
         self.password = password
@@ -528,7 +531,7 @@ class MySQL(ObjectReq):
             try:
                 if crs is None:
                     crs = self.con.cursor()
-                logging.getLogger(__name__).debug("execute: %s %s" % (args, kwargs))
+                self.log.debug("execute: %s %s" % (args, kwargs))
                 crs.execute(*args, **kwargs)
                 if commit:
                     self.con.commit()
@@ -536,7 +539,7 @@ class MySQL(ObjectReq):
             except my.OperationalError:
                 if not countdown:
                     raise
-                logging.getLogger(__name__).info("execute: Database down, trying to reconnect (%d attempts left)..." % countdown)
+                self.log.info("execute: Database down, trying to reconnect (%d attempts left)..." % countdown)
                 if countdown<self.retry_count:
                     sleep(self.retry_pause)    # no need to melt down server on longer outage
                 self.close()
@@ -568,7 +571,7 @@ class MySQL(ObjectReq):
         rows = self.query("".join(query), params, commit=True).fetchall()
 
         if len(rows)>1:
-            logging.getLogger(__name__).warn("get_client_by_name: query returned more than one result (cert_names = %s, name = %s, secret = %s): %s" % (cert_names, name, secret, ", ".join([str(Client(**row)) for row in rows])))
+            self.log.warn("get_client_by_name: query returned more than one result (cert_names = %s, name = %s, secret = %s): %s" % (cert_names, name, secret, ", ".join([str(Client(**row)) for row in rows])))
             return None
 
         return Client(**rows[0]) if rows else None
@@ -738,7 +741,7 @@ class MySQL(ObjectReq):
 
 
     def insertLastReceivedId(self, client, id):
-        logging.getLogger(__name__).debug("insertLastReceivedId: id %i for client %i(%s)" % (id, client.id, client.hostname))
+        self.log.debug("insertLastReceivedId: id %i for client %i(%s)" % (id, client.id, client.hostname))
         try:
             self.query("INSERT INTO last_events(client_id, event_id, timestamp) VALUES(%s, %s, NOW())", (client.id, id))
             self.con.commit()
@@ -759,10 +762,10 @@ class MySQL(ObjectReq):
             row = res[0]
         except IndexError:
             id = None
-            logging.getLogger(__name__).debug("getLastReceivedId: probably first access, unable to get id for client %i(%s)" % (client.id, client.hostname))
+            self.log.debug("getLastReceivedId: probably first access, unable to get id for client %i(%s)" % (client.id, client.hostname))
         else:
             id = row["id"]
-            logging.getLogger(__name__).debug("getLastReceivedId: id %i for client %i(%s)" % (id, client.id, client.hostname))
+            self.log.debug("getLastReceivedId: id %i for client %i(%s)" % (id, client.id, client.hostname))
 
         return id
 
@@ -830,10 +833,10 @@ def expose(read=1, write=0, debug=0):
     return expose_deco
 
 
-class Server(ObjectReq):
+class Server(ObjectBase):
 
-    def __init__(self, req, auth, handler):
-        ObjectReq.__init__(self, req)
+    def __init__(self, req, log, auth, handler):
+        ObjectBase.__init__(self, req, log)
         self.auth = auth
         self.handler = handler
 
@@ -849,7 +852,7 @@ class Server(ObjectReq):
         for a in intargs:
             del args[a]
         if intargs:
-            logging.getLogger(__name__).info("sanitize_args: Called with internal args: %s" % ", ".join(intargs))
+            self.log.info("sanitize_args: Called with internal args: %s" % ", ".join(intargs))
 
         # silently remove surplus arguments - potential forward
         # compatibility (unknown args will get ignored)
@@ -857,7 +860,7 @@ class Server(ObjectReq):
         for a in badargs:
             del args[a]
         if badargs:
-            logging.getLogger(__name__).info("sanitize_args: Called with superfluous args: %s" % ", ".join(badargs))
+            self.log.info("sanitize_args: Called with superfluous args: %s" % ", ".join(badargs))
 
         return args
 
@@ -952,13 +955,13 @@ def json_wrapper(method):
     return meth_deco
 
 
-class WardenHandler(ObjectReq):
+class WardenHandler(ObjectBase):
 
-    def __init__(self, req, validator, db, auth,
+    def __init__(self, req, log, validator, db, auth,
             send_events_limit=500, get_events_limit=1000,
             description=None):
 
-        ObjectReq.__init__(self, req)
+        ObjectBase.__init__(self, req, log)
         self.auth = auth
         self.db = db
         self.validator = validator
@@ -1027,7 +1030,7 @@ class WardenHandler(ObjectReq):
             try:
                 id = self.db.getLastReceivedId(self.req.client)
             except Exception, e:
-                logging.getLogger(__name__).info("cannot getLastReceivedId - " + type(e).__name__ + ": " + str(e))
+                self.log.info("cannot getLastReceivedId - " + type(e).__name__ + ": " + str(e))
                 
         if id is None:
             # First access, remember the guy and get him last id
@@ -1055,7 +1058,7 @@ class WardenHandler(ObjectReq):
 
         self.db.insertLastReceivedId(self.req.client, res['lastid'])
 
-        logging.getLogger(__name__).info("sending %d events, lastid is %i" % (len(res["events"]), res["lastid"]))
+        self.log.info("sending %d events, lastid is %i" % (len(res["events"]), res["lastid"]))
 
         return res
 
@@ -1135,7 +1138,7 @@ class WardenHandler(ObjectReq):
         else:
             saved = len(events_tosend)
 
-        logging.getLogger(__name__).info("Saved %i events" % saved)
+        self.log.info("Saved %i events" % saved)
         if errs:
             raise self.req.error(errors=errs)
 
@@ -1243,25 +1246,31 @@ def build_server(conf):
         },
         "PlainAuthenticator": {
             "req": {"type": obj, "default": "req"},
+            "log": {"type": obj, "default": "log"},
             "db": {"type": obj, "default": "db"}
         },
         "X509Authenticator": {
             "req": {"type": obj, "default": "req"},
+            "log": {"type": obj, "default": "log"},
             "db": {"type": obj, "default": "db"}
         },
         "X509NameAuthenticator": {
             "req": {"type": obj, "default": "req"},
+            "log": {"type": obj, "default": "log"},
             "db": {"type": obj, "default": "db"}
         },
         "NoValidator": {
             "req": {"type": obj, "default": "req"},
+            "log": {"type": obj, "default": "log"},
         },
         "JSONSchemaValidator": {
             "req": {"type": obj, "default": "req"},
+            "log": {"type": obj, "default": "log"},
             "filename": {"type": filepath, "default": path.join(path.dirname(__file__), "idea.schema")}
         },
         "MySQL": {
             "req": {"type": obj, "default": "req"},
+            "log": {"type": obj, "default": "log"},
             "host": {"type": str, "default": "localhost"},
             "user": {"type": str, "default": "warden"},
             "password": {"type": str, "default": ""},
@@ -1275,6 +1284,7 @@ def build_server(conf):
         },
         "WardenHandler": {
             "req": {"type": obj, "default": "req"},
+            "log": {"type": obj, "default": "log"},
             "validator": {"type": obj, "default": "validator"},
             "db": {"type": obj, "default": "DB"},
             "auth": {"type": obj, "default": "auth"},
@@ -1284,6 +1294,7 @@ def build_server(conf):
         },
         "Server": {
             "req": {"type": obj, "default": "req"},
+            "log": {"type": obj, "default": "log"},
             "auth": {"type": obj, "default": "auth"},
             "handler": {"type": obj, "default": "handler"}
         }