#!/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)
