Skip to main content

fastapi gcp log formatting package

Project description

Fastapi_glogger

This is a package for formatting your fastapi logs into structured google logs to be used with google cloud services like cloud run.

Installation

Packge

Install the package using pip (only test package is available right now):

 pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ starlette-gcp-logs==0.0.2

Source Code

After cloning the repo

install dependencies using poetry

poetry install

Look the a main.py for a an example how to use it with FastAPI

from fastapi import FastAPI
from src.fastapi_glogger import setup_fastapi
import logging

app = setup_fastapi(FastAPI())


@app.get("/")
async def root():
    logging.info("Hello World")
    return {"message": "Hello World"}

Test mode (Locally)

To run the example code or package locally:

  • set the environment variable IS_TEST to true as it will need GOOGLE_APPLICATION_CREDENTIALS env variable otherwise to authenticate with google cloud logging.

On GCP (Cloud)

using cloud run you can deploy a container and the env variable gets set automatically from your account data.

API

setup_fastapi(app: FastAPI, additional_headers: Optional[Dict[str, str]] =None) -> FastAPI

  • app : the fast api constructor
  • additional_headers: dictionary where you specify:
    • key: the string you want injected the formatted log
    • value: the header that you want injected ex: {'testInject':'test'} it gets test from headers and puts it inside testInject in the outputted log

Examples

Additional Headers

Import and use the package in your Python script:

from fastapi import FastAPI
from fastapi_glogger import setup_fastapi
import logging

app =  setup_fastapi(FastAPI(), {"testInjected": "test"})

@app.get("/")
def read_root():
    logging.info("Hello world")
    return {"Hello world"}

The logged message should be outputted like this

{
    "severity": "INFO",
    "timestamp": "2024-09-05 09:48:01,485",
    "pathname": "/app/main.py",
    "logger_name": "root",
    "logging.googleapis.com/sourceLocation": {
        "file": "main.py",
        "line": "9",
        "function": "read_root"
    },
    "logging.googleapis.com/spanId": 9508110491393966220,
    "auditInfo": {
        "http_request": {
            "request_method": "GET",
            "request_url": "http://gcp-url/",
            "user_agent": "curl/7.36.1",
            "remote_ip": "52.12.45.123",
            "referer": null,
            "protocol": "https"
        },
        "testInjected": "This is test content"
    },
    "message": "[main:9]: Hello World"
}

Overriding exception handling

there is an existing wrapper over the fastapi exception handling for HTTPException and RequestValidationError that just adds a layer of logging above the fastapi handling. you can override these by adding your own exception handling code after setting up the formatter.

from fastapi import FastAPI
from src.fastapi_glogger import setup_fastapi
from fastapi.exceptions import RequestValidationError, HTTPException as StarletteHTTPException
import logging


app = setup_fastapi(FastAPI(), additional_headers={"TestInjected": "test"})

@app.add_exception_handler(StarletteHTTPException)
async def http_exception_handler(request, exc):
    logging.error(f"HTTP Exception: {exc.detail}")
    return exc


@app.get("/")
async def root():
    logging.info("Hello World")
    return {"message": "Hello World"}

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fastapi_glogger-0.1.0.tar.gz (6.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fastapi_glogger-0.1.0-py3-none-any.whl (7.3 kB view details)

Uploaded Python 3

File details

Details for the file fastapi_glogger-0.1.0.tar.gz.

File metadata

  • Download URL: fastapi_glogger-0.1.0.tar.gz
  • Upload date:
  • Size: 6.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.6

File hashes

Hashes for fastapi_glogger-0.1.0.tar.gz
Algorithm Hash digest
SHA256 94a397db016eb1fad482ae310fc0b7cd87d21e5c08f2982baee7f1cf08eb621c
MD5 8634cfbc6e6cbdd82c0f5fea77dbaf28
BLAKE2b-256 c278189e3c287d2761f3dd1f10f971b9e7a74ba5eed7a30e140af229bd53dec0

See more details on using hashes here.

File details

Details for the file fastapi_glogger-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for fastapi_glogger-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 73fe35a56c6f80e054ce914ad4d9760a091d0288ee3878407ae425d39e3ba415
MD5 f37928a0097d3507b335dbe5dbd4cb79
BLAKE2b-256 f8160d88b287341da8b25d87154ee66c2fc4c6d508821fcad2ce6e582f94febc

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page