All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.8.5 - 2026-04-06
- Use
Zsuffix for UTC timestamps instead of+00:00to match server schema requirements - Normalize caller-supplied
+00:00offsets toZinLogEntry.__post_init__ - Omit
trace_idfromto_dict()whenNone— server rejects null values
0.8.4 - 2026-03-21
AsyncLogTideClient: full async client usingaiohttpwith the same API as the sync client — supportsasync with,await client.start(), and all logging, flush, query, and stream methods as coroutines (pip install logtide-sdk[async])LogTideHandler: standardlogging.Handlerfor drop-in integration with Python's built-in logging module — forwards records to LogTide with structured exception metadata whenexc_info=Trueis usedPayloadLimitsOptions: configurable safeguards against 413 errors — per-field size cap, total entry size cap, named field exclusion, and automatic base64 removalLogTideStarletteMiddleware: standalone Starlette ASGI middleware independent of FastAPI (pip install logtide-sdk[starlette])serialize_exception()exported at top level for use in custom integrationspayload_limitsfield onClientOptions
- BREAKING API paths updated to match v1 server contract:
POST /api/logs→POST /api/v1/ingestGET /api/logs→GET /api/v1/logsGET /api/logs/trace/{id}→GET /api/v1/logs/trace/{id}GET /api/logs/stats→GET /api/v1/logs/aggregatedGET /api/logs/stream→GET /api/v1/logs/stream
- BREAKING Auth header changed from
Authorization: Bearer <key>toX-API-Key: <key> - BREAKING Error metadata key changed from
"error"to"exception"; value is now a structured object withtype,message,language,stacktrace(array of{file, function, line}frames), andraw - BREAKING
stream()no longer blocks — it runs in a background daemon thread and returns aCallable[[], None]stop function immediately - BREAKING Buffer overflow no longer raises
BufferFullError; logs are silently dropped andlogs_droppedis incremented (BufferFullErrorclass is kept for backwards-compatible catch blocks) requests.Sessionis now created once and reused across all HTTP calls for connection reuse and reduced TCP overheaddatetime.utcnow()replaced withdatetime.now(timezone.utc)throughout;LogEntry.timenow includes+00:00timezone suffix (ISO 8601 compliant)- Middleware
__init__.pynow uses per-frameworktry/exceptguards — importinglogtide_sdk.middlewareno longer fails if only a subset of frameworks are installed
- Flask, Django, and FastAPI middleware
_log_errormethods were passing rawExceptionobjects into the metadata dict instead of serializing them — exceptions are now serialized viaserialize_exception() log()triggeredflush()while holding_buffer_lock, causing a potential deadlock under concurrent access — flush is now triggered outside the lock__version__in__init__.pywas incorrectly set to"0.1.0"despite the package being at0.1.2
0.1.0 - 2026-01-13
- Initial release of LogTide Python SDK
- Automatic batching with configurable size and interval
- Retry logic with exponential backoff
- Circuit breaker pattern for fault tolerance
- Max buffer size with drop policy
- Query API for searching and filtering logs
- Live tail with Server-Sent Events (SSE)
- Trace ID context for distributed tracing
- Global metadata support
- Structured error serialization
- Internal metrics tracking
- Logging methods: debug, info, warn, error, critical
- Thread-safe operations
- Graceful shutdown with atexit hook
- Flask middleware for auto-logging HTTP requests
- Django middleware for auto-logging HTTP requests
- FastAPI middleware for auto-logging HTTP requests
- Full type hints support for Python 3.8+