forked from Hay1tsme/artemis
Allows us to extend the logging infrastructure, e.g. by adding Loki/Discord webhooks to the mix.
55 lines
1.4 KiB
Python
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})
|