Source code for brewtils.log

"""Brewtils Logging Utilities

This module is for setting up your plugins logging correctly.

Example:
    In order to use this, you should simply call ``setup_logger`` in the same file where you
    initialize your plugin sometime before you initialize your Plugin object.

    .. code-block:: python

        host = 'localhost'
        port = 2337
        ssl_enabled = False
        system_name = 'my_system'

        setup_logger(bg_host=host, bg_port=port, system_name=system_name, ssl_enabled=ssl_enabled)
        plugin = Plugin(my_client, bg_host=host, bg_port=port, ssl_enabled=ssl_enabled,
                        name=system_name, version="0.0.1")
        plugin.run()
"""

import logging.config
import copy
import brewtils

# Loggers to always use. These are things that generally,
# people do not want to see and/or are too verbose.
DEFAULT_LOGGERS = {
    "pika": {
        "level": "ERROR"
    },
    "requests.packages.urllib3.connectionpool": {
        "level": "WARN"
    }
}

# A simple default format/formatter. Generally speaking, the API should return formatters,
# but since users can configure their logging, it's better if the formatter has a logical backup.
DEFAULT_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
DEFAULT_FORMATTERS = {
    "default": {
        "format": DEFAULT_FORMAT
    }
}

# A simple default handler. Generally speaking, the API should return handlers, but since
# users can configure their logging, it's better if the handler has a logical backup.
DEFAULT_HANDLERS = {
    "default": {
        "class": "logging.StreamHandler",
        "formatter": "default",
        "stream": "ext://sys.stdout"
    }
}

# The template that plugins will use to log
DEFAULT_PLUGIN_LOGGING_TEMPLATE = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {},
    "handlers": {},
    "loggers": DEFAULT_LOGGERS,
}

# If no logging was configured, this will be used as the logging configuration
DEFAULT_LOGGING_CONFIG = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": DEFAULT_FORMATTERS,
    "handlers": DEFAULT_HANDLERS,
    "loggers": DEFAULT_LOGGERS,
    "root": {
        "level": "INFO",
        "handlers": ["default"]
    }
}


[docs]def setup_logger(bg_host, bg_port, system_name, ca_cert=None, client_cert=None, ssl_enabled=None): """Configures python logging module to use logging specified in beer-garden API. This method will overwrite your current logging configuration, so only call it if you want beer-garden's logging configuration. :param str bg_host: Hostname of a beer-garden :param int bg_port: Port beer-garden is listening on :param str system_name: The system :param ca_cert: Certificate that issued the server certificate used by the beer-garden server :param client_cert: Certificate used by the server making the connection to beer-garden :param bool ssl_enabled: Whether to use SSL for beer-garden communication :return: """ config = get_python_logging_config(bg_host=bg_host, bg_port=bg_port, system_name=system_name, ca_cert=ca_cert, client_cert=client_cert, ssl_enabled=ssl_enabled) logging.config.dictConfig(config)
[docs]def get_python_logging_config(bg_host, bg_port, system_name, ca_cert=None, client_cert=None, ssl_enabled=None): """Returns a dictionary for the python logging configuration :param str bg_host: Hostname of a beer-garden :param int bg_port: Port beer-garden is listening on :param str system_name: The system :param ca_cert: Certificate that issued the server certificate used by the beer-garden server :param client_cert: Certificate used by the server making the connection to beer-garden :param bool ssl_enabled: Whether to use SSL for beer-garden communication :return: Python logging configuration """ client = brewtils.get_easy_client(host=bg_host, port=bg_port, ssl_enabled=ssl_enabled, ca_cert=ca_cert, client_cert=client_cert) logging_config = client.get_logging_config(system_name=system_name) return convert_logging_config(logging_config)
[docs]def convert_logging_config(logging_config): """Converts a LoggingConfig object into a python logging configuration The python logging configuration that is returned can be passed to `logging.config.dictConfig` :param logging_config: :return: Python logging configuration """ config_to_return = copy.deepcopy(DEFAULT_PLUGIN_LOGGING_TEMPLATE) if logging_config.handlers: handlers = logging_config.handlers else: handlers = copy.deepcopy(DEFAULT_HANDLERS) config_to_return['handlers'] = handlers if logging_config.formatters: formatters = logging_config.formatters else: formatters = copy.deepcopy(DEFAULT_FORMATTERS) config_to_return['formatters'] = formatters config_to_return['root'] = { "level": logging_config.level, "handlers": list(config_to_return['handlers'].keys()) } return config_to_return