import logging
import sys
from loguru import logger
from .LogBroadcastMessagePublisher import LogBroadcastMessagePublisher
from .LoguruInterceptHandler import LoguruInterceptHandler
def initialize_service_logging(
loglevel: int, service_name: str, service_instance_name: str
) -> None:
logger.debug("Configuring service logging.")
originator = f"{service_name}.{service_instance_name}"
_init_logger(originator, loglevel)
def initialize_script_logging(
loglevel: str, script_name: str, use_central_logging: bool = True
) -> None:
logger.debug("Configuring script logging.")
originator = f"{script_name}"
allowed_levels = ["DEBUG", "INFO", "ERROR"]
if loglevel in allowed_levels:
_init_logger(originator, logging.getLevelName(loglevel), use_central_logging)
else:
raise ValueError(f"Allowed log levels are: {allowed_levels}")
def _init_logger(
originator: str, loglevel: int, use_central_logging: bool = True
) -> None:
# default format
fmt = (
"{time:DD.MM HH:mm:ss.SSS} {message} "
+ "{name}:{function}:{line}@{process.name}/{thread.name}"
)
config = {
"handlers": [
{"sink": sys.stderr, "format": fmt, "level": loglevel},
],
"extra": {
"originator": originator,
},
}
logger.configure(**config)
if use_central_logging:
exchange_logger = LogBroadcastMessagePublisher(originator)
# DEBUG messages and above are sent to the central logging instance
# note that this could be a problem if a lot of debug messages are sent per second
logger.add(exchange_logger.send_msg, enqueue=True, level="DEBUG") # type: ignore
# see https://loguru.readthedocs.io/en/stable/api/logger.html#color
logger.level("DEBUG", color="")
# celery default colors
# 'DEBUG': COLORS['blue'],
# 'WARNING': COLORS['yellow'],
# 'ERROR': COLORS['red'],
# 'CRITICAL': COLORS['magenta'],
loguru_intercept_handler = LoguruInterceptHandler()
logging.basicConfig(handlers=[loguru_intercept_handler], level=loglevel)
# library default log levels
# -> get name of logger using pythons logger "logging"
# sqlalchemy spams statements to INFO level, therefore set to WARNING
logging.getLogger("sqlalchemy.engine").setLevel(logging.WARNING)
# datamodel_code_generator spams debug messages, therefore set to INFO
logging.getLogger("blib2to3.pgen2.driver").setLevel(logging.INFO)
# add loguru handler
logging.getLogger("sqlalchemy.engine").handlers = [loguru_intercept_handler]
logging.getLogger("uvicorn").handlers = [loguru_intercept_handler]