diff --git a/poetry.lock b/poetry.lock index 4b36f6feb4..6739a3a183 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1916,24 +1916,6 @@ typing-extensions = ">=4.5.0" typing-inspect = ">=0.8.0" urllib3 = "<2" -[[package]] -name = "loguru" -version = "0.7.2" -description = "Python logging made (stupidly) simple" -optional = false -python-versions = ">=3.5" -files = [ - {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, - {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, -] - -[package.dependencies] -colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} -win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} - -[package.extras] -dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] - [[package]] name = "markupsafe" version = "2.1.3" @@ -5154,20 +5136,6 @@ files = [ [package.extras] test = ["pytest (>=6.0.0)", "setuptools (>=65)"] -[[package]] -name = "win32-setctime" -version = "1.1.0" -description = "A small Python utility to set file creation time on Windows" -optional = false -python-versions = ">=3.5" -files = [ - {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, - {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, -] - -[package.extras] -dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] - [[package]] name = "wrapt" version = "1.15.0" @@ -5357,4 +5325,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.11,<3.12" -content-hash = "02ab2873e2074cbed0b415f5fa8addce0fd945487d12944f4c8043d4fc617de9" +content-hash = "28fe3510739b539671c6cf447706c17934c31094f1a860e9e95452d9e63f5a46" diff --git a/private_gpt/__init__.py b/private_gpt/__init__.py index dd7fcef4b9..1f409831ef 100644 --- a/private_gpt/__init__.py +++ b/private_gpt/__init__.py @@ -1 +1,11 @@ """private-gpt.""" +import logging + +# Set to 'DEBUG' to have extensive logging turned on, even for libraries +ROOT_LOG_LEVEL = "INFO" + +PRETTY_LOG_FORMAT = ( + "%(asctime)s.%(msecs)03d [%(levelname)-8s] %(name)+25s - %(message)s" +) +logging.basicConfig(level=ROOT_LOG_LEVEL, format=PRETTY_LOG_FORMAT, datefmt="%H:%M:%S") +logging.captureWarnings(True) diff --git a/private_gpt/__main__.py b/private_gpt/__main__.py index 100dfdc38d..6bf2f156ec 100644 --- a/private_gpt/__main__.py +++ b/private_gpt/__main__.py @@ -5,4 +5,7 @@ from private_gpt.main import app from private_gpt.settings.settings import settings -uvicorn.run(app, host="0.0.0.0", port=settings.server.port) +# Set log_config=None to do not use the uvicorn logging configuration, and +# use ours instead. For reference, see below: +# https://github.com/tiangolo/fastapi/discussions/7457#discussioncomment-5141108 +uvicorn.run(app, host="0.0.0.0", port=settings.server.port, log_config=None) diff --git a/private_gpt/components/llm/custom/sagemaker.py b/private_gpt/components/llm/custom/sagemaker.py index 08f56a955e..070f8ed678 100644 --- a/private_gpt/components/llm/custom/sagemaker.py +++ b/private_gpt/components/llm/custom/sagemaker.py @@ -3,6 +3,7 @@ import io import json +import logging from typing import TYPE_CHECKING, Any import boto3 # type: ignore @@ -26,6 +27,8 @@ CompletionResponseGen, ) +logger = logging.getLogger(__name__) + class LineIterator: r"""A helper class for parsing the byte stream input from TGI container. @@ -81,7 +84,7 @@ def __next__(self) -> Any: continue raise if "PayloadPart" not in chunk: - print("Unknown event type:" + chunk) + logger.warning("Unknown event type=%s", chunk) continue self.buffer.seek(0, io.SEEK_END) self.buffer.write(chunk["PayloadPart"]["Bytes"]) diff --git a/private_gpt/main.py b/private_gpt/main.py index 7a6dc66b6c..f5f193e2f0 100644 --- a/private_gpt/main.py +++ b/private_gpt/main.py @@ -1,11 +1,9 @@ """FastAPI app creation, logger configuration and main API routes.""" -import sys from typing import Any import llama_index from fastapi import FastAPI from fastapi.openapi.utils import get_openapi -from loguru import logger from private_gpt.paths import docs_path from private_gpt.server.chat.chat_router import chat_router @@ -16,21 +14,6 @@ from private_gpt.server.ingest.ingest_router import ingest_router from private_gpt.settings.settings import settings -# Remove pre-configured logging handler -logger.remove(0) -# Create a new logging handler same as the pre-configured one but with the extra -# attribute `request_id` -logger.add( - sys.stdout, - level="INFO", - format=( - "{time:YYYY-MM-DD HH:mm:ss.SSS} | " - "{level: <8} | " - "{name}:{function}:{line} | " - "ID: {extra[request_id]} - {message}" - ), -) - # Add LlamaIndex simple observability llama_index.set_global_handler("simple") diff --git a/private_gpt/settings/settings_loader.py b/private_gpt/settings/settings_loader.py index d4b3d55cea..99c2ca4075 100644 --- a/private_gpt/settings/settings_loader.py +++ b/private_gpt/settings/settings_loader.py @@ -1,4 +1,5 @@ import functools +import logging import os import sys from pathlib import Path @@ -9,6 +10,8 @@ from private_gpt.constants import PROJECT_ROOT_PATH from private_gpt.settings.yaml import load_yaml_with_envvars +logger = logging.getLogger(__name__) + _settings_folder = os.environ.get("PGPT_SETTINGS_FOLDER", PROJECT_ROOT_PATH) # if running in unittest, use the test profile @@ -41,7 +44,7 @@ def load_profile(profile: str) -> dict[str, Any]: def load_active_profiles() -> dict[str, Any]: """Load active profiles and merge them.""" - print(f"Starting application with profiles: {active_profiles}") + logger.info("Starting application with profiles=%s", active_profiles) loaded_profiles = [load_profile(profile) for profile in active_profiles] merged: dict[str, Any] = functools.reduce(deep_update, loaded_profiles, {}) return merged diff --git a/pyproject.toml b/pyproject.toml index 7ac7330527..bc1d075bd8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,6 @@ authors = ["Zylon "] [tool.poetry.dependencies] python = ">=3.11,<3.12" fastapi = { extras = ["all"], version = "^0.103.1" } -loguru = "^0.7.2" boto3 = "^1.28.56" injector = "^0.21.0" pyyaml = "^6.0.1"