#!/usr/bin/env python2 # Copyright (c) 2014 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. # This module brings together the magic to setup logging correctly for # pseudomodem. import logging import logging.handlers import os import sys SYSLOG_DEVICE = '/dev/log' class ModemManagerFormatter(logging.Formatter): """ Format log strings such that rsyslogd handles them correctly. By adding a prefix 'ModemManager[xxx]' where |xxx| contains the pid, we can ensure that rsyslogd treats the messages the same way it treats messages from ModemManager. """ def __init__(self, *args, **kwargs): super(ModemManagerFormatter, self).__init__(*args, **kwargs) self._pid = os.getpid() def format(self, record): """ The main function that converts log records to strings. @param record: The log record. @returns: The formatted log string. """ result = super(ModemManagerFormatter, self).format(record) return 'pseudomodem[%d]: %s' % (self._pid, result) def SetupLogging(): """ The main function that sets up logging as expected. It does the following: (1) Clear out existing logging setup that leaks in during autotest import. (2) Setup logging handler to log to stdout (3) Setup logging handler to log to syslog. """ root = logging.getLogger() for handler in root.handlers: root.removeHandler(handler) stdout_handler = logging.StreamHandler(sys.stdout) stdout_formatter = logging.Formatter( fmt='%(asctime)s %(levelname)-5.5s| %(message)s', datefmt='%H:%M:%S') stdout_handler.setFormatter(stdout_formatter) root.addHandler(stdout_handler) syslog_handler = logging.handlers.SysLogHandler( SYSLOG_DEVICE, facility=logging.handlers.SysLogHandler.LOG_DAEMON) syslog_formatter = ModemManagerFormatter( fmt='%(levelname)-5.5s|%(module)10.10s:%(lineno)4.4d| %(message)s') syslog_handler.setFormatter(syslog_formatter) root.addHandler(syslog_handler)