elastic_agent_client/util/logger.py (47 lines of code) (raw):

# # Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one # or more contributor license agreements. Licensed under the Elastic License 2.0; # you may not use this file except in compliance with the Elastic License 2.0. # """ Logger -- sets the logging and provides a `logger` global object. """ import logging import ecs_logging import elastic_agent_client.generated.elastic_agent_client_pb2 as proto AGENT_PROTOCOL_TO_PYTHON_LOG_LEVEL = { proto.UnitLogLevel.ERROR: logging.ERROR, proto.UnitLogLevel.WARN: logging.WARNING, proto.UnitLogLevel.INFO: logging.INFO, proto.UnitLogLevel.DEBUG: logging.DEBUG, proto.UnitLogLevel.TRACE: logging.DEBUG, } class ExtraLogger(logging.Logger): def _log( self, level, msg, args, exc_info=None, extra=None, stack_info=None, stacklevel=None, prefix=None, ): if prefix: msg = f"{prefix} {msg}" if extra is None: extra = {} super(ExtraLogger, self)._log(level, msg, args, exc_info, extra) def convert_agent_log_level(agent_log_level): """ Maps a log level from the protobuf UnitLogLevel enum to a Python logging level. Since the UnitLogLevel enum doesn't directly map to Python's logging integer levels, this function provides a manual mapping to convert between the two. If an unknown log level is provided, the function defaults to logging.INFO. """ return AGENT_PROTOCOL_TO_PYTHON_LOG_LEVEL.get(agent_log_level, logging.INFO) def set_logger(log_level=logging.INFO): try: _logger = logger except NameError: _logger = None if _logger is None: logging.setLoggerClass(ExtraLogger) _logger = logging.getLogger("agent-client-py") _logger.handlers.clear() handler = logging.StreamHandler() handler.setFormatter(ecs_logging.StdlibFormatter()) _logger.addHandler(handler) _logger.propagate = False _logger.setLevel(log_level) _logger.handlers[0].setLevel(log_level) return _logger global logger logger: logging.Logger = set_logger()