diff --git a/backend/src/evalassist/__init__.py b/backend/src/evalassist/__init__.py index 5caab1b3..c10988db 100644 --- a/backend/src/evalassist/__init__.py +++ b/backend/src/evalassist/__init__.py @@ -1,23 +1,4 @@ import logging -root_pkg_logger = logging.getLogger(__name__) -root_pkg_logger.propagate = False - -# Stream handler (console) -stream_handler = logging.StreamHandler() -stream_handler.setLevel(logging.DEBUG) - -formatter = logging.Formatter( - "%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s" -) -stream_handler.setFormatter(formatter) -root_pkg_logger.addHandler(stream_handler) - -# File handler -file_handler = logging.FileHandler("app.log", mode="a", encoding="utf-8") -file_handler.setLevel(logging.DEBUG) -file_handler.setFormatter(formatter) -root_pkg_logger.addHandler(file_handler) - -# Set logger level -root_pkg_logger.setLevel(logging.DEBUG) +logger = logging.getLogger(__name__) +logger.addHandler(logging.NullHandler()) diff --git a/backend/src/evalassist/const.py b/backend/src/evalassist/const.py index 5e3a70d7..699456ff 100644 --- a/backend/src/evalassist/const.py +++ b/backend/src/evalassist/const.py @@ -62,6 +62,7 @@ STATIC_DIR = Path(os.getenv("STATIC_DIR", EVAL_ASSIST_DIR / "static")) DATA_DIR = Path(os.getenv("DATA_DIR", EVAL_ASSIST_DIR / "data")).expanduser() DATA_DIR.mkdir(parents=True, exist_ok=True) +LOG_DIR = Path(os.getenv("EVALASSIST_LOG_DIR", EVAL_ASSIST_DIR / "logs")).expanduser() DEFAULT_DATABASE_URL = f"sqlite:////{DATA_DIR / 'evalassist.db'}" DATABASE_URL = os.getenv("DATABASE_URL", DEFAULT_DATABASE_URL) TEMPORARY_FILES_FOLDER = EVAL_ASSIST_DIR / "temporary_files" diff --git a/backend/src/evalassist/logging_config.py b/backend/src/evalassist/logging_config.py new file mode 100644 index 00000000..dfe0e1e5 --- /dev/null +++ b/backend/src/evalassist/logging_config.py @@ -0,0 +1,61 @@ +import logging +import logging.config +import os +import pathlib + +from evalassist.const import LOG_DIR + + +def configure_logging(): + handlers = ["console"] + dict_config: dict = { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "standard": { + "format": "%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s" + } + }, + "handlers": { + "console": { + "class": "logging.StreamHandler", + "level": "INFO", # or configurable via env / CLI flag + "formatter": "standard", + "stream": "ext://sys.stdout", + }, + }, + "root": {"handlers": handlers, "level": "DEBUG", "propagate": False}, + # 👇 Add this + "loggers": { + "httpx": { + "level": "WARNING", + "handlers": [], + "propagate": True, + }, + "LiteLLM": { + "level": "WARNING", + "handlers": [], + "propagate": True, + }, + # Sometimes LiteLLM uses lowercase logger names: + "litellm": { + "level": "WARNING", + "handlers": [], + "propagate": True, + }, + }, + } + + if LOG_DIR: + pathlib.Path(LOG_DIR).mkdir(parents=True, exist_ok=True) + handlers.append("file") + dict_config["handlers"]["file"] = { + "class": "logging.FileHandler", + "level": "DEBUG", + "formatter": "standard", + "filename": os.path.join(LOG_DIR, "evalassist.log"), + "encoding": "utf-8", + "mode": "a", + } + + logging.config.dictConfig(dict_config) diff --git a/backend/src/evalassist/main.py b/backend/src/evalassist/main.py index 8cdc4ec3..96638fdb 100644 --- a/backend/src/evalassist/main.py +++ b/backend/src/evalassist/main.py @@ -8,6 +8,7 @@ import nest_asyncio import pandas as pd from evalassist.judges.base import UnitxtInferenceEngineMixin +from evalassist.logging_config import configure_logging from fastapi import ( APIRouter, BackgroundTasks, @@ -89,6 +90,7 @@ ) nest_asyncio.apply() +configure_logging() logger = logging.getLogger(__name__) app = FastAPI() app.add_middleware( diff --git a/backend/src/evalassist/utils.py b/backend/src/evalassist/utils.py index 4a47be5b..383da3fe 100644 --- a/backend/src/evalassist/utils.py +++ b/backend/src/evalassist/utils.py @@ -62,9 +62,8 @@ def get_custom_models(): with open(CUSTOM_MODELS_PATH, "r", encoding="utf-8") as file: try: custom_models = json.load(file) - from . import root_pkg_logger - root_pkg_logger.debug( + logger.debug( "Loaded the following custom models", json.dumps(custom_models, indent=2), )