Skip to main content

Official Timberlogs SDK for Python - structured logging made simple

Project description

Timberlogs Python SDK

The official Timberlogs SDK for Python applications. Send structured logs to Timberlogs with automatic batching, retry logic, and flow tracking.

Installation

pip install timberlogs-client

Quick Start

from timberlogs import create_timberlogs

timber = create_timberlogs(
    source="my-app",
    environment="production",
    api_key="tb_live_xxxxxxxxxxxxx",
)

timber.info("Hello, Timberlogs!")

Features

  • Structured logging - Log with arbitrary JSON data
  • Automatic batching - Efficiently batch logs before sending
  • Retry with backoff - Automatic retry on failures
  • Flow tracking - Group related logs together
  • Level filtering - Filter logs by severity
  • Async support - Full async/await support
  • Context manager - Automatic cleanup with with statement

Basic Usage

Log Levels

timber.debug("Detailed diagnostic info", {"key": "value"})
timber.info("General information", {"user_id": "123"})
timber.warn("Warning condition", {"threshold": 90})
timber.error("Error occurred", {"code": "E001"})

Logging with Data

timber.info("User signed in", {
    "user_id": "user_123",
    "method": "oauth",
    "provider": "google",
})

Error Logging

# With Exception object (extracts name, message, stack)
try:
    risky_operation()
except Exception as e:
    timber.error("Operation failed", e)

# With data object
timber.error("Validation failed", {
    "field": "email",
    "reason": "invalid format",
})

Tags

from timberlogs import LogOptions

timber.info("Payment processed", {"amount": 99.99}, LogOptions(tags=["payments", "success"]))

Setting User/Session IDs

# Set defaults for all subsequent logs
timber.set_user_id("user_123")
timber.set_session_id("sess_abc")

# Clear on logout
timber.set_user_id(None)
timber.set_session_id(None)

Method Chaining

timber.set_user_id("user_123").set_session_id("sess_abc").info("User action")

Flow Tracking

Flows group related logs together with automatic step indexing:

# Synchronous flow (local ID generation)
flow = timber.flow("checkout")
flow.info("Started checkout", {"items": 3})
flow.info("Payment processed", {"amount": 99.99})
flow.info("Order confirmed", {"order_id": "ord_123"})

Async Flow (Server-Generated ID)

import asyncio

async def process_checkout():
    flow = await timber.flow_async("checkout")
    flow.info("Started checkout")
    flow.info("Payment processed")
    flow.info("Order confirmed")

asyncio.run(process_checkout())

Flow Properties

flow = timber.flow("user-onboarding")
print(flow.id)    # "user-onboarding-a1b2c3d4"
print(flow.name)  # "user-onboarding"

Configuration

All Options

from timberlogs import create_timberlogs

timber = create_timberlogs(
    # Required
    source="my-app",                    # Your app/service name
    environment="production",           # development, staging, production

    # Authentication
    api_key="tb_live_xxx",              # Your Timberlogs API key

    # Optional
    version="1.2.3",                    # Your app version
    user_id="user_123",                 # Default user ID
    session_id="sess_abc",              # Default session ID
    batch_size=10,                      # Logs to batch before sending
    flush_interval=5.0,                 # Auto-flush interval (seconds)
    min_level="info",                   # Minimum level to send
    on_error=lambda e: print(e),        # Error callback

    # Retry configuration
    max_retries=3,                      # Retry attempts
    initial_delay_ms=1000,              # Initial retry delay
    max_delay_ms=30000,                 # Maximum retry delay
)

Environment Variables

import os
from timberlogs import create_timberlogs

timber = create_timberlogs(
    source="my-app",
    environment=os.getenv("ENVIRONMENT", "development"),
    api_key=os.getenv("TIMBER_API_KEY"),
)

Level Filtering

timber = create_timberlogs(
    source="my-app",
    environment="production",
    api_key="tb_live_xxx",
    min_level="warn",  # Only send warn and error
)

timber.debug("Not sent")  # Filtered
timber.info("Not sent")   # Filtered
timber.warn("Sent")       # Sent
timber.error("Sent")      # Sent

Async Usage

import asyncio
from timberlogs import create_timberlogs

async def main():
    timber = create_timberlogs(
        source="my-app",
        environment="production",
        api_key="tb_live_xxx",
    )

    timber.info("Starting async operation")

    # Create async flow with server-generated ID
    flow = await timber.flow_async("async-job")
    flow.info("Step 1")
    flow.info("Step 2")

    # Async flush
    await timber.flush_async()

    # Async disconnect
    await timber.disconnect_async()

asyncio.run(main())

Async Context Manager

async def main():
    async with create_timberlogs(
        source="my-app",
        environment="production",
        api_key="tb_live_xxx",
    ) as timber:
        timber.info("Auto-flushed on exit")

Context Manager

with create_timberlogs(
    source="my-app",
    environment="production",
    api_key="tb_live_xxx",
) as timber:
    timber.info("Logs are auto-flushed on exit")

Low-Level Logging

For full control over log entries:

from timberlogs import LogEntry

timber.log(LogEntry(
    level="info",
    message="Custom log entry",
    data={"custom": "data"},
    user_id="user_123",
    session_id="sess_abc",
    request_id="req_xyz",
    tags=["important", "billing"],
))

API Reference

TimberlogsClient Methods

Method Description
debug(message, data?, options?) Log debug message
info(message, data?, options?) Log info message
warn(message, data?, options?) Log warning message
error(message, error_or_data?, options?) Log error message
log(entry) Log with full control
flow(name) Create flow (local ID)
flow_async(name) Create flow (server ID)
set_user_id(user_id) Set default user ID
set_session_id(session_id) Set default session ID
flush() Send queued logs immediately
flush_async() Async send queued logs
disconnect() Flush and stop client
disconnect_async() Async flush and stop
should_log(level) Check if level passes filter

Flow Methods

Method Description
debug(message, data?, options?) Log debug message
info(message, data?, options?) Log info message
warn(message, data?, options?) Log warning message
error(message, error_or_data?, options?) Log error message
id Property: flow ID
name Property: flow name

Releasing

  1. Bump the version in pyproject.toml and timberlogs/__init__.py
  2. Commit and push to master
  3. Create a GitHub release with tag vX.Y.Z (e.g., v1.1.1)
  4. The publish.yml workflow automatically builds and publishes to PyPI via OIDC trusted publishing

Requirements

  • Python 3.8+
  • httpx >= 0.24.0

License

MIT License - see LICENSE for details.

Links

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

timberlogs_client-1.2.1.tar.gz (21.0 kB view details)

Uploaded Source

Built Distribution

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

timberlogs_client-1.2.1-py3-none-any.whl (12.3 kB view details)

Uploaded Python 3

File details

Details for the file timberlogs_client-1.2.1.tar.gz.

File metadata

  • Download URL: timberlogs_client-1.2.1.tar.gz
  • Upload date:
  • Size: 21.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for timberlogs_client-1.2.1.tar.gz
Algorithm Hash digest
SHA256 eea216f40d83b9282b880e2189cbc76d19249d5bede6d8a20638f3b8621ddbe2
MD5 e0ebb32a4907f6089108f9902da2727a
BLAKE2b-256 369f6681da4de822f46bbb776fc52c7835cc835bf92d3cf5c6a9532fecba9a90

See more details on using hashes here.

Provenance

The following attestation bundles were made for timberlogs_client-1.2.1.tar.gz:

Publisher: publish.yml on enaboapps/timberlogs-python-sdk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file timberlogs_client-1.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for timberlogs_client-1.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 83deda949e26188e8524b64bb3677ce71621b784581fa19207cd64ec4fce827e
MD5 870e315f7687168e6c459270c858ef8a
BLAKE2b-256 8e665ba55a07e7932986f8e85196e4faa99bf62a3613d734acaed4cf31e9f1a4

See more details on using hashes here.

Provenance

The following attestation bundles were made for timberlogs_client-1.2.1-py3-none-any.whl:

Publisher: publish.yml on enaboapps/timberlogs-python-sdk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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