1#!/usr/bin/env python2 2# Copyright (c) 2014 The Chromium OS Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6# This module brings together the magic to setup logging correctly for 7# pseudomodem. 8 9import logging 10import logging.handlers 11import os 12import sys 13 14SYSLOG_DEVICE = '/dev/log' 15 16class ModemManagerFormatter(logging.Formatter): 17 """ 18 Format log strings such that rsyslogd handles them correctly. 19 20 By adding a prefix 'ModemManager[xxx]' where |xxx| contains the pid, we can 21 ensure that rsyslogd treats the messages the same way it treats messages 22 from ModemManager. 23 24 """ 25 def __init__(self, *args, **kwargs): 26 super(ModemManagerFormatter, self).__init__(*args, **kwargs) 27 self._pid = os.getpid() 28 29 30 def format(self, record): 31 """ 32 The main function that converts log records to strings. 33 34 @param record: The log record. 35 @returns: The formatted log string. 36 37 """ 38 result = super(ModemManagerFormatter, self).format(record) 39 return 'pseudomodem[%d]: %s' % (self._pid, result) 40 41 42def SetupLogging(): 43 """ 44 The main function that sets up logging as expected. It does the following: 45 46 (1) Clear out existing logging setup that leaks in during autotest import. 47 (2) Setup logging handler to log to stdout 48 (3) Setup logging handler to log to syslog. 49 50 """ 51 root = logging.getLogger() 52 for handler in root.handlers: 53 root.removeHandler(handler) 54 55 stdout_handler = logging.StreamHandler(sys.stdout) 56 stdout_formatter = logging.Formatter( 57 fmt='%(asctime)s %(levelname)-5.5s| %(message)s', 58 datefmt='%H:%M:%S') 59 stdout_handler.setFormatter(stdout_formatter) 60 root.addHandler(stdout_handler) 61 62 syslog_handler = logging.handlers.SysLogHandler( 63 SYSLOG_DEVICE, 64 facility=logging.handlers.SysLogHandler.LOG_DAEMON) 65 syslog_formatter = ModemManagerFormatter( 66 fmt='%(levelname)-5.5s|%(module)10.10s:%(lineno)4.4d| %(message)s') 67 syslog_handler.setFormatter(syslog_formatter) 68 root.addHandler(syslog_handler) 69