Skip to main content

Google Cloud Logging formatter for structlog

This is an opiniated package that configures structlog to output log compatible with the Google Cloud Logging log format.

The intention of this package is to be used for applications that run in Google Kubernetes Engine (GKE) or Google Cloud Function, or any other systems that know how to send logs to Google Cloud.

As such, the package is only concerned about formatting logs, where logs are expected to be written on the standard output. Sending the logs to the actual Google Logging API is supposed to be done by an external agent.

In particular, this package provides the following configuration by default:

How to use?

Install the package with pip or your favorite Python package manager:

pip install structlog-gcp

Then, configure structlog as usual, using the Structlog processors the package provides:

import structlog
import structlog_gcp

processors = structlog_gcp.build_processors()
structlog.configure(processors=processors)

Then, you can use structlog as usual:

logger = structlog.get_logger().bind(arg1="something")

logger.info("Hello world")

converted = False
try:
    int("foobar")
    converted = True
except:
    logger.exception("Something bad happens")

if not converted:
    logger.critical("This is not supposed to happen", converted=converted)

try:
    1 / 0
except ZeroDivisionError as exc:
    logger.info("This was known to happen! {exc}")

The structlog_gcp.build_processors() function constructs structlog processors to:

  • Output logs as Google Cloud Logging format using the default Python JSON serializer.
  • Carry context variables across loggers (see structlog: Context Variables)

For more advanced usage, see Advanced Configuration

Errors

Errors are automatically reported to the Google Error Reporting service, most of the time.

Using logger.exception

Using:

try:
    1 / 0
except:
    logger.exception("oh no")

Will give you:

  • The current exception can automatically added into the log event
  • The log level will be ERROR
  • The exception will be reported in Error Reporting
Using logger.$LEVEL(..., exception=exc)

Using:

try:
    1 / 0
except Exception as exc
    logger.info("oh no", exception=exc)

Will give you:

  • The specified exception will be part of the log event
  • The log level will be INFO, or whichever log level you used
  • The exception will be reported in Error Reporting
Using logger.$LEVEL(...)

Not passing any exception argument to the logger, as in:

try:
    1 / 0
except Exception as exc
    logger.warning(f"oh no: {exc}")

Will give you:

  • The exception will not be part of the log event.
  • The log level will be WARNING (or whichever log level you used)
  • AND the exception will not be reported in Error Reporting

Configuration

You can configure the service name and the version used during the report with 2 different ways:

  • By default, the library assumes to run with Cloud Run environment variables configured, in particular the K_SERVICE and K_REVISION variables.

  • You can also pass the service name and revision at configuration time with:

    import structlog
    import structlog_gcp
    
    processors = structlog_gcp.build_processors(
        service="my-service",
        version="v1.2.3",
    )
    structlog.configure(processors=processors)
    

Advanced Configuration

If you need to have more control over the processors configured by the library, you can use the structlog_gcp.build_gcp_processors() builder function.

This function only configures the Google Cloud Logging-specific processors and omits all the rest.

In particular, you can use this function:

  • If you want to have more control over the processors to be configured in structlog. You can prepend or append other processors around the Google-specific ones.
  • If you want to serialize using another JSON serializer or with specific options.

For instance:

import orjson
import structlog
from structlog.processors import JSONRenderer

import structlog_gcp


def add_open_telemetry_spans(...):
    # Cf. https://www.structlog.org/en/stable/frameworks.html#opentelemetry
    ...

gcp_processors = structlog_gcp.build_gcp_processors()

# Fine-tune processors
processors = [add_open_telemetry_spans]
processors.extend(gcp_processors)
processors.append(JSONRenderer(serializer=orjson.dumps))

structlog.configure(processors=processors)

Examples

Check out the examples folder to see how it can be used.

  • How it should appear in the Google Cloud Logging log explorer:

  • How it should appear in the Google Cloud Error Reporting dashboard:

Reference

Metadata

Release files for structlog-gcp 0.5.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for structlog-gcp 0.5.1
File Size Uploaded
structlog_gcp-0.5.1.tar.gz 137.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for structlog-gcp 0.5.1
File Interpreter ABI Platform
structlog_gcp-0.5.1-py3-none-any.whl Python 3 none any Details

Total release size: 146.8 kB

Release files / structlog_gcp-0.5.1.tar.gz

Download URL structlog_gcp-0.5.1.tar.gz
Size 137.1 kB
Tags Source
SHA-256 checksum
How to use checksums
44a9b13f237a2de52df7b2fd4bd20cf0e71cf84888cbab6d07ffed9fcc22c157
BLAKE2b-256 checksum
How to use checksums
54e96e41f243d583b55213e0edf6396b75ed95ced2b9fc1d8f679501096496d5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 7, 2026.

Transparency log

Release files / structlog_gcp-0.5.1-py3-none-any.whl

Download URL structlog_gcp-0.5.1-py3-none-any.whl
Size 9.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6c9bb790307e17eb1d00fa3643a455176699e194ecaf59b83fa07549ca80ae6b
BLAKE2b-256 checksum
How to use checksums
23c1e3fee1ee5b951c2c725966b3166fb5c0ed08de0c68eff3d259ad9f8fbe7a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 7, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.5.1 This release

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

0.0.3

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page