diff --git a/frappy/logging.py b/frappy/logging.py index b9c20a4..f182889 100644 --- a/frappy/logging.py +++ b/frappy/logging.py @@ -51,6 +51,7 @@ def check_level(level): class RemoteLogHandler(mlzlog.Handler): """handler for remote logging""" + def __init__(self): super().__init__() self.subscriptions = {} # dict[modname] of tuple(mobobj, dict [conn] of level) @@ -131,7 +132,6 @@ class HasComlog: directory = join(logger.logdir, logger.rootname, 'comlog', self.secNode.name) self._comLog.addHandler(ComLogfileHandler( directory, self.name, max_days=generalConfig.getint('comlog_days', 7))) - return def comLog(self, msg, *args, **kwds): self.log.log(COMLOG, msg, *args, **kwds) @@ -139,6 +139,11 @@ class HasComlog: self._comLog.info(msg, *args) +def init_remote_logging(log): + '''Install RemoteLogHandler to the given logger.''' + log.addHandler(RemoteLogHandler()) + + class MainLogger: def __init__(self): self.log = None @@ -164,8 +169,6 @@ class MainLogger: logfile_handler = LogfileHandler(self.logdir, self.rootname, max_days=logfile_days) logfile_handler.setLevel(LOG_LEVELS[generalConfig.get('logfile_level', 'info')]) self.log.addHandler(logfile_handler) - - self.log.addHandler(RemoteLogHandler()) self.log.handlers[0].setLevel(LOG_LEVELS[console_level]) diff --git a/frappy/modulebase.py b/frappy/modulebase.py index 423249c..60856de 100644 --- a/frappy/modulebase.py +++ b/frappy/modulebase.py @@ -523,6 +523,7 @@ class Module(HasAccessibles): value = pobj.datatype(value) except Exception as e: err = e + changed = False else: changed = pobj.value != value or pobj.readerror # store the value even in case of error @@ -797,10 +798,19 @@ class Module(HasAccessibles): def setRemoteLogging(self, conn, level, send_log): if self.remoteLogHandler is None: - for handler in self.log.handlers: - if isinstance(handler, RemoteLogHandler): - handler.send_log = send_log - self.remoteLogHandler = handler + # for non-mlzlog loggers: search parents for remoteloghandler + log = self.log + while log is not None: + for handler in log.handlers: + if isinstance(handler, RemoteLogHandler): + handler.send_log = send_log + self.remoteLogHandler = handler + break + if self.remoteLogHandler is None: + # if the log message does not propagate, we would not get it in + # the handler anyway, so we can stop searching and fail + log = log.parent if log.propagate else None + else: break else: raise ValueError('remote handler not found') diff --git a/frappy/server.py b/frappy/server.py index f00599a..bc1956e 100644 --- a/frappy/server.py +++ b/frappy/server.py @@ -31,6 +31,7 @@ from frappy.config import load_config from frappy.errors import ConfigError from frappy.lib import formatException, generalConfig, get_class, mkthread from frappy.lib.multievent import MultiEvent +from frappy.logging import init_remote_logging from frappy.params import PREDEFINED_ACCESSIBLES from frappy.secnode import SecNode @@ -62,7 +63,8 @@ class Server: Arguments: - name: the node name - - parent_logger: the logger to inherit from + - parent_logger: the logger to inherit from. a handler is installed by + the server to provide remote logging - cfgfiles: if not given, defaults to name may be a comma separated list of cfg files items ending with .cfg are taken as paths, else .cfg is appended and @@ -93,6 +95,7 @@ class Server: # sanitize name (in case it is a cfgfile) name = os.path.splitext(os.path.basename(name))[0] self.log = parent_logger.getChild(name, True) + init_remote_logging(self.log) merged_cfg = load_config(cfgfiles, self.log) self.node_cfg = merged_cfg.pop('node') diff --git a/test/test_logging.py b/test/test_logging.py index 1136e80..7213c92 100644 --- a/test/test_logging.py +++ b/test/test_logging.py @@ -19,13 +19,15 @@ # # ***************************************************************************** -import pytest import mlzlog +import pytest + +import frappy.logging +from frappy.logging import HasComlog, generalConfig, init_remote_logging, \ + logger from frappy.modules import Module from frappy.protocol.dispatcher import Dispatcher -from frappy.protocol.interface import encode_msg_frame, decode_msg -import frappy.logging -from frappy.logging import logger, generalConfig, HasComlog +from frappy.protocol.interface import decode_msg, encode_msg_frame class SecNodeStub: @@ -127,6 +129,7 @@ def init_(monkeypatch): generalConfig.testinit(logger_root='frappy', comlog=comlog) logger.init(console_level) + init_remote_logging(logger.log) self.srv = ServerStub() self.conn1 = Connection('conn1', self.srv.dispatcher, self.result_dict['conn1']) diff --git a/test/test_server.py b/test/test_server.py index 5116614..e670d6f 100644 --- a/test/test_server.py +++ b/test/test_server.py @@ -37,6 +37,11 @@ class LoggerStub: def getChild(self, *args): return self + + def addHandler(self, *args): + pass + + info = warning = exception = error = debug handlers = []