Files
artemis/core/logger.py
beerpsi 994fa0d41e Centralized logging
Allows us to extend the logging infrastructure, e.g. by adding Loki/Discord webhooks to the mix.
2024-04-20 12:11:37 +00:00

55 lines
1.4 KiB
Python

import logging
import logging.handlers
import os
from typing import TYPE_CHECKING, Optional
import coloredlogs
if TYPE_CHECKING:
from core.config import CoreConfig
__all__ = (
"create_logger",
)
log_fmt_str = "[%(asctime)s] %(title)s | %(levelname)s | %(message)s"
log_fmt = logging.Formatter(log_fmt_str)
console_handler = logging.StreamHandler()
console_handler.setFormatter(log_fmt)
artemis_logger = logging.getLogger("artemis")
artemis_logger.addHandler(console_handler)
def create_logger(
title: str,
config: Optional["CoreConfig"] = None,
level: Optional[str] = None,
*,
logger_name: Optional[str] = None,
):
logger_name = logger_name or title.lower().replace(" ", "_")
logger = artemis_logger.getChild(logger_name)
if getattr(logger, "initialized", False):
return logging.LoggerAdapter(logger, {"title": title})
if config is None:
raise ValueError("Logger has not been initialized, but no configuration was passed.")
file_handler = logging.handlers.TimedRotatingFileHandler(
os.path.join(config.server.log_dir, f"{logger_name}.log"),
when="d",
backupCount=10,
)
file_handler.setFormatter(log_fmt)
logger.addHandler(file_handler)
logger.setLevel(level or logging.INFO)
logger.initialized = True
coloredlogs.install(level=level, logger=logger, fmt=log_fmt_str)
return logging.LoggerAdapter(logger, {"title": title})