From a8ab3abc569be4c11dd63a9c67e6f0964f53d4cf Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Wed, 12 Apr 2017 20:40:49 +0300 Subject: [PATCH] Fixed infinite recursion when using serial ports When using serial ports for logging, an infinite recursion occurs if the serial port cannot be opened. The solution is to add the serial port log handler only after the serial port has been opened successfully. Closes-bug: #1692888 Change-Id: Ifb2352292dd31869ee6d5ff83fe53584dd684ebd --- cloudbaseinit/utils/log.py | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/cloudbaseinit/utils/log.py b/cloudbaseinit/utils/log.py index daace057..da4d9f42 100644 --- a/cloudbaseinit/utils/log.py +++ b/cloudbaseinit/utils/log.py @@ -52,23 +52,20 @@ class SerialPortHandler(logging.StreamHandler): def __init__(self): super(SerialPortHandler, self).__init__(None) - self.stream = None + self.stream = self._open() @staticmethod def _open(): serial_port = None if CONF.logging_serial_port_settings: settings = CONF.logging_serial_port_settings.split(',') - try: - serial_port = serial.Serial(port=settings[0], - baudrate=int(settings[1]), - parity=settings[2], - bytesize=int(settings[3])) - if not serial_port.isOpen(): - serial_port.open() - serial_port.write = _safe_write(serial_port.write) - except serial.SerialException as exc: - LOG.debug(exc) + serial_port = serial.Serial(port=settings[0], + baudrate=int(settings[1]), + parity=settings[2], + bytesize=int(settings[3])) + if not serial_port.isOpen(): + serial_port.open() + serial_port.write = _safe_write(serial_port.write) return serial_port def emit(self, record): @@ -95,12 +92,15 @@ def setup(product_name): log.setup(CONF, product_name) if CONF.logging_serial_port_settings: - log_root = log.getLogger(product_name).logger + try: + serialportlog = SerialPortHandler() + log_root = log.getLogger(product_name).logger + log_root.addHandler(serialportlog) - serialportlog = SerialPortHandler() - log_root.addHandler(serialportlog) - - datefmt = CONF.log_date_format - serialportlog.setFormatter( - formatters.ContextFormatter(project=product_name, - datefmt=datefmt)) + datefmt = CONF.log_date_format + serialportlog.setFormatter( + formatters.ContextFormatter(project=product_name, + datefmt=datefmt)) + except serial.SerialException: + LOG.warn("Serial port: {0} could not be opened".format( + CONF.logging_serial_port_settings))