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
This commit is contained in:
Adrian Vladu 2017-04-12 20:40:49 +03:00
parent 1581d6f946
commit a8ab3abc56
1 changed files with 19 additions and 19 deletions

View File

@ -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))