From f8a5943ff079c51fc766df16db5af22cea6c35c6 Mon Sep 17 00:00:00 2001 From: Bakar Tavadze Date: Mon, 6 May 2024 14:29:03 +0400 Subject: [PATCH 1/6] Add logging libraries to dependencies. --- backend/poetry.lock | 30 +++++++++++++++++++++++++++++- backend/pyproject.toml | 2 ++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/backend/poetry.lock b/backend/poetry.lock index 62ebed8a..0566d167 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -2854,6 +2854,17 @@ files = [ [package.extras] dev = ["black (==24.1.1)", "build (==1.0.3)", "flake8 (==7.0.0)", "pytest (==8.0.0)", "twine (==4.0.2)"] +[[package]] +name = "python-json-logger" +version = "2.0.7" +description = "A python library adding a json log formatter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, + {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, +] + [[package]] name = "python-magic" version = "0.4.27" @@ -3464,6 +3475,23 @@ typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\"" [package.extras] full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] +[[package]] +name = "structlog" +version = "24.1.0" +description = "Structured Logging for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "structlog-24.1.0-py3-none-any.whl", hash = "sha256:3f6efe7d25fab6e86f277713c218044669906537bb717c1807a09d46bca0714d"}, + {file = "structlog-24.1.0.tar.gz", hash = "sha256:41a09886e4d55df25bdcb9b5c9674bccfab723ff43e0a86a1b7b236be8e57b16"}, +] + +[package.extras] +dev = ["structlog[tests,typing]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "sphinxext-opengraph", "twisted"] +tests = ["freezegun (>=0.2.8)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "simplejson"] +typing = ["mypy (>=1.4)", "rich", "twisted"] + [[package]] name = "tabulate" version = "0.9.0" @@ -4212,4 +4240,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = "^3.9.0,<3.12" -content-hash = "fc96cf95416874baa59fc1b85463f4e1e9e5ade9e1c76febb74cadf341da11bb" +content-hash = "0aacc4acc2d8098312ba7d910552bad3414648886bb76ba9fd5b293822fe36c9" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 4c99f56e..e1597bb8 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -43,6 +43,8 @@ asyncpg = "^0.29.0" langchain-core = "^0.1.44" pyjwt = {extras = ["crypto"], version = "^2.8.0"} langchain-anthropic = "^0.1.8" +structlog = "^24.1.0" +python-json-logger = "^2.0.7" [tool.poetry.group.dev.dependencies] uvicorn = "^0.23.2" From c7e2503728be1120cd77d552ed40d95b72a619f9 Mon Sep 17 00:00:00 2001 From: Bakar Tavadze Date: Mon, 6 May 2024 14:29:33 +0400 Subject: [PATCH 2/6] Add logging config. --- .gitignore | 2 +- backend/log_config.json | 61 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 backend/log_config.json diff --git a/.gitignore b/.gitignore index ae1c1eed..4d00501b 100644 --- a/.gitignore +++ b/.gitignore @@ -53,7 +53,7 @@ package-lock.json *.temp # Log files -*.log +*.log* logs/ npm-debug.log* yarn-debug.log* diff --git a/backend/log_config.json b/backend/log_config.json new file mode 100644 index 00000000..ea5470ee --- /dev/null +++ b/backend/log_config.json @@ -0,0 +1,61 @@ +{ + "version": 1, + "disable_existing_loggers": false, + "formatters": { + "default": { + "()": "uvicorn.logging.DefaultFormatter", + "fmt": "%(asctime)s - %(name)s - %(levelprefix)s %(message)s" + }, + "access": { + "()": "uvicorn.logging.AccessFormatter", + "fmt": "%(asctime)s - %(name)s - %(levelprefix)s %(client_addr)s - \"%(request_line)s\" %(status_code)s" + }, + "json": { + "()": "pythonjsonlogger.jsonlogger.JsonFormatter" + } + }, + "handlers": { + "default": { + "formatter": "default", + "class": "logging.StreamHandler", + "stream": "ext://sys.stderr" + }, + "access": { + "formatter": "access", + "class": "logging.StreamHandler", + "stream": "ext://sys.stdout" + }, + "file": { + "formatter": "json", + "class": "logging.handlers.RotatingFileHandler", + "filename": "./app.log", + "mode": "a+", + "maxBytes": 10000000, + "backupCount": 1 + } + }, + "loggers": { + "app": { + "handlers": [ + "default", + "file" + ], + "level": "INFO" + }, + "uvicorn": { + "handlers": [ + "default", + "file" + ], + "level": "INFO" + }, + "uvicorn.access": { + "handlers": [ + "access", + "file" + ], + "level": "INFO", + "propagate": false + } + } +} \ No newline at end of file From 2e4e2eda624ce6452c4b298752b0e2e8a98eb376 Mon Sep 17 00:00:00 2001 From: Bakar Tavadze Date: Mon, 6 May 2024 14:30:25 +0400 Subject: [PATCH 3/6] Use logging config. --- Dockerfile | 2 +- backend/Dockerfile | 2 +- backend/Makefile | 2 +- backend/app/lifespan.py | 18 ++++++++++++++++++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index b1122845..7289dedb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -45,4 +45,4 @@ COPY ./backend . # Copy the frontend build COPY --from=builder /frontend/dist ./ui -ENTRYPOINT [ "uvicorn", "app.server:app", "--host", "0.0.0.0" ] +ENTRYPOINT [ "uvicorn", "app.server:app", "--host", "0.0.0.0", "--log-config", "log_config.json" ] diff --git a/backend/Dockerfile b/backend/Dockerfile index edf898e3..371e807b 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -29,4 +29,4 @@ COPY . . HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --start-interval=1s --retries=3 CMD [ "curl", "-f", "http://localhost:8000/health" ] -ENTRYPOINT [ "uvicorn", "app.server:app", "--host", "0.0.0.0" ] +ENTRYPOINT [ "uvicorn", "app.server:app", "--host", "0.0.0.0", "--log-config", "log_config.json" ] diff --git a/backend/Makefile b/backend/Makefile index 3e8dc5b2..3f24ce37 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -14,7 +14,7 @@ build_ui: TEST_FILE ?= tests/unit_tests/ start: - poetry run uvicorn app.server:app --reload --port 8100 + poetry run uvicorn app.server:app --reload --port 8100 --log-config log_config.json migrate: migrate -database postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT)/$(POSTGRES_DB)?sslmode=disable -path ./migrations up diff --git a/backend/app/lifespan.py b/backend/app/lifespan.py index 8e15f139..384249b1 100644 --- a/backend/app/lifespan.py +++ b/backend/app/lifespan.py @@ -3,6 +3,7 @@ import asyncpg import orjson +import structlog from fastapi import FastAPI _pg_pool = None @@ -26,6 +27,23 @@ async def _init_connection(conn) -> None: @asynccontextmanager async def lifespan(app: FastAPI): + structlog.configure( + processors=[ + structlog.stdlib.filter_by_level, + structlog.stdlib.add_logger_name, + structlog.stdlib.add_log_level, + structlog.stdlib.PositionalArgumentsFormatter(), + structlog.processors.TimeStamper(fmt="iso"), + structlog.processors.StackInfoRenderer(), + structlog.processors.format_exc_info, + structlog.processors.UnicodeDecoder(), + structlog.stdlib.render_to_log_kwargs, + ], + logger_factory=structlog.stdlib.LoggerFactory(), + wrapper_class=structlog.stdlib.BoundLogger, + cache_logger_on_first_use=True, + ) + global _pg_pool _pg_pool = await asyncpg.create_pool( From ca5679f4c55f70ad96d55deb8d218c99ed804acd Mon Sep 17 00:00:00 2001 From: Bakar Tavadze Date: Mon, 6 May 2024 14:32:34 +0400 Subject: [PATCH 4/6] Use structlog instead of the default logging library. --- backend/app/llms.py | 4 ++-- backend/app/server.py | 4 ++-- backend/app/stream.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/app/llms.py b/backend/app/llms.py index dc7fbae7..2e4f35b9 100644 --- a/backend/app/llms.py +++ b/backend/app/llms.py @@ -1,17 +1,17 @@ -import logging import os from functools import lru_cache from urllib.parse import urlparse import boto3 import httpx +import structlog from langchain_anthropic import ChatAnthropic from langchain_community.chat_models import BedrockChat, ChatFireworks from langchain_community.chat_models.ollama import ChatOllama from langchain_google_vertexai import ChatVertexAI from langchain_openai import AzureChatOpenAI, ChatOpenAI -logger = logging.getLogger(__name__) +logger = structlog.get_logger(__name__) @lru_cache(maxsize=4) diff --git a/backend/app/server.py b/backend/app/server.py index 9dd65743..65ef6bb7 100644 --- a/backend/app/server.py +++ b/backend/app/server.py @@ -1,8 +1,8 @@ -import logging import os from pathlib import Path import orjson +import structlog from fastapi import FastAPI, Form, UploadFile from fastapi.exceptions import HTTPException from fastapi.staticfiles import StaticFiles @@ -13,7 +13,7 @@ from app.lifespan import lifespan from app.upload import convert_ingestion_input_to_blob, ingest_runnable -logger = logging.getLogger(__name__) +logger = structlog.get_logger(__name__) app = FastAPI(title="OpenGPTs API", lifespan=lifespan) diff --git a/backend/app/stream.py b/backend/app/stream.py index 9162d36c..2bfddb58 100644 --- a/backend/app/stream.py +++ b/backend/app/stream.py @@ -1,12 +1,12 @@ -import logging from typing import Any, AsyncIterator, Dict, Optional, Sequence, Union import orjson +import structlog from langchain_core.messages import AnyMessage, BaseMessage, message_chunk_to_message from langchain_core.runnables import Runnable, RunnableConfig from langserve.serialization import WellKnownLCSerializer -logger = logging.getLogger(__name__) +logger = structlog.get_logger(__name__) MessagesStream = AsyncIterator[Union[list[AnyMessage], str]] From 29286dd37938c6bbb4c6a6d421f9d1d2b9b24d4d Mon Sep 17 00:00:00 2001 From: Bakar Tavadze Date: Mon, 6 May 2024 14:57:11 +0400 Subject: [PATCH 5/6] Add root logger to config. --- backend/log_config.json | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/backend/log_config.json b/backend/log_config.json index ea5470ee..1f6bd1c1 100644 --- a/backend/log_config.json +++ b/backend/log_config.json @@ -34,20 +34,29 @@ "backupCount": 1 } }, + "root": { + "handlers": [ + "default", + "file" + ], + "level": "INFO" + }, "loggers": { "app": { "handlers": [ "default", "file" ], - "level": "INFO" + "level": "INFO", + "propagate": false }, "uvicorn": { "handlers": [ "default", "file" ], - "level": "INFO" + "level": "INFO", + "propagate": false }, "uvicorn.access": { "handlers": [ From 6be55d903061bd51c51c1af8e28430c1c3c6774a Mon Sep 17 00:00:00 2001 From: Bakar Tavadze Date: Mon, 6 May 2024 15:11:04 +0400 Subject: [PATCH 6/6] poetry lock --no-update --- backend/poetry.lock | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/backend/poetry.lock b/backend/poetry.lock index 0566d167..39d58458 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -1935,6 +1935,7 @@ description = "Powerful and Pythonic XML processing library combining libxml2/li optional = false python-versions = ">=3.6" files = [ + {file = "lxml-5.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:704f5572ff473a5f897745abebc6df40f22d4133c1e0a1f124e4f2bd3330ff7e"}, {file = "lxml-5.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9d3c0f8567ffe7502d969c2c1b809892dc793b5d0665f602aad19895f8d508da"}, {file = "lxml-5.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5fcfbebdb0c5d8d18b84118842f31965d59ee3e66996ac842e21f957eb76138c"}, {file = "lxml-5.1.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f37c6d7106a9d6f0708d4e164b707037b7380fcd0b04c5bd9cae1fb46a856fb"}, @@ -1944,6 +1945,7 @@ files = [ {file = "lxml-5.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:82bddf0e72cb2af3cbba7cec1d2fd11fda0de6be8f4492223d4a268713ef2147"}, {file = "lxml-5.1.0-cp310-cp310-win32.whl", hash = "sha256:b66aa6357b265670bb574f050ffceefb98549c721cf28351b748be1ef9577d93"}, {file = "lxml-5.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:4946e7f59b7b6a9e27bef34422f645e9a368cb2be11bf1ef3cafc39a1f6ba68d"}, + {file = "lxml-5.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:14deca1460b4b0f6b01f1ddc9557704e8b365f55c63070463f6c18619ebf964f"}, {file = "lxml-5.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ed8c3d2cd329bf779b7ed38db176738f3f8be637bb395ce9629fc76f78afe3d4"}, {file = "lxml-5.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:436a943c2900bb98123b06437cdd30580a61340fbdb7b28aaf345a459c19046a"}, {file = "lxml-5.1.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acb6b2f96f60f70e7f34efe0c3ea34ca63f19ca63ce90019c6cbca6b676e81fa"}, @@ -1953,6 +1955,7 @@ files = [ {file = "lxml-5.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4c9bda132ad108b387c33fabfea47866af87f4ea6ffb79418004f0521e63204"}, {file = "lxml-5.1.0-cp311-cp311-win32.whl", hash = "sha256:bc64d1b1dab08f679fb89c368f4c05693f58a9faf744c4d390d7ed1d8223869b"}, {file = "lxml-5.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5ab722ae5a873d8dcee1f5f45ddd93c34210aed44ff2dc643b5025981908cda"}, + {file = "lxml-5.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9aa543980ab1fbf1720969af1d99095a548ea42e00361e727c58a40832439114"}, {file = "lxml-5.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6f11b77ec0979f7e4dc5ae081325a2946f1fe424148d3945f943ceaede98adb8"}, {file = "lxml-5.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a36c506e5f8aeb40680491d39ed94670487ce6614b9d27cabe45d94cd5d63e1e"}, {file = "lxml-5.1.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f643ffd2669ffd4b5a3e9b41c909b72b2a1d5e4915da90a77e119b8d48ce867a"}, @@ -1978,8 +1981,8 @@ files = [ {file = "lxml-5.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8f52fe6859b9db71ee609b0c0a70fea5f1e71c3462ecf144ca800d3f434f0764"}, {file = "lxml-5.1.0-cp37-cp37m-win32.whl", hash = "sha256:d42e3a3fc18acc88b838efded0e6ec3edf3e328a58c68fbd36a7263a874906c8"}, {file = "lxml-5.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:eac68f96539b32fce2c9b47eb7c25bb2582bdaf1bbb360d25f564ee9e04c542b"}, + {file = "lxml-5.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ae15347a88cf8af0949a9872b57a320d2605ae069bcdf047677318bc0bba45b1"}, {file = "lxml-5.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c26aab6ea9c54d3bed716b8851c8bfc40cb249b8e9880e250d1eddde9f709bf5"}, - {file = "lxml-5.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cfbac9f6149174f76df7e08c2e28b19d74aed90cad60383ad8671d3af7d0502f"}, {file = "lxml-5.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:342e95bddec3a698ac24378d61996b3ee5ba9acfeb253986002ac53c9a5f6f84"}, {file = "lxml-5.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:725e171e0b99a66ec8605ac77fa12239dbe061482ac854d25720e2294652eeaa"}, {file = "lxml-5.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d184e0d5c918cff04cdde9dbdf9600e960161d773666958c9d7b565ccc60c45"}, @@ -1987,6 +1990,7 @@ files = [ {file = "lxml-5.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d48fc57e7c1e3df57be5ae8614bab6d4e7b60f65c5457915c26892c41afc59e"}, {file = "lxml-5.1.0-cp38-cp38-win32.whl", hash = "sha256:7ec465e6549ed97e9f1e5ed51c657c9ede767bc1c11552f7f4d022c4df4a977a"}, {file = "lxml-5.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:b21b4031b53d25b0858d4e124f2f9131ffc1530431c6d1321805c90da78388d1"}, + {file = "lxml-5.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:52427a7eadc98f9e62cb1368a5079ae826f94f05755d2d567d93ee1bc3ceb354"}, {file = "lxml-5.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a2a2c724d97c1eb8cf966b16ca2915566a4904b9aad2ed9a09c748ffe14f969"}, {file = "lxml-5.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:843b9c835580d52828d8f69ea4302537337a21e6b4f1ec711a52241ba4a824f3"}, {file = "lxml-5.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b99f564659cfa704a2dd82d0684207b1aadf7d02d33e54845f9fc78e06b7581"}, @@ -2915,6 +2919,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -4240,4 +4245,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = "^3.9.0,<3.12" -content-hash = "0aacc4acc2d8098312ba7d910552bad3414648886bb76ba9fd5b293822fe36c9" +content-hash = "b7d0f0b5e51111723047cfbc8122c71d33e6f15f71f8243d5734bd09c8ee12a1"