testing/mozbase/mozlog/mozlog/stdadapter.py
author Stephen A Pohl <spohl.mozilla.bugs@gmail.com>
Sat, 25 Mar 2023 18:04:45 +0000
changeset 657941 93996ea3c7de5814ea96307834c7109dd618bd16
parent 647332 8e89f8e20ad6336c3cbb4d895d36077e46f6489b
permissions -rw-r--r--
Bug 660452: Enable services submenu in macOS context menus. r=mstange Differential Revision: https://phabricator.services.mozilla.com/D173635

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

import logging

from .structuredlog import StructuredLogger, log_levels


class UnstructuredHandler(logging.Handler):
    def __init__(self, name=None, level=logging.NOTSET):
        self.structured = StructuredLogger(name)
        logging.Handler.__init__(self, level=level)

    def emit(self, record):
        if record.levelname in log_levels:
            log_func = getattr(self.structured, record.levelname.lower())
        else:
            log_func = self.logger.debug
        log_func(record.msg)

    def handle(self, record):
        self.emit(record)


class LoggingWrapper(object):
    def __init__(self, wrapped):
        self.wrapped = wrapped
        self.wrapped.addHandler(
            UnstructuredHandler(
                self.wrapped.name, logging.getLevelName(self.wrapped.level)
            )
        )

    def add_handler(self, handler):
        self.addHandler(handler)

    def remove_handler(self, handler):
        self.removeHandler(handler)

    def __getattr__(self, name):
        return getattr(self.wrapped, name)


def std_logging_adapter(logger):
    """Adapter for stdlib logging so that it produces structured
    messages rather than standard logging messages

    :param logger: logging.Logger to wrap"""
    return LoggingWrapper(logger)