Releases: logtide-dev/logtide-python
Releases · logtide-dev/logtide-python
v0.9.0
What's new
Added
- structlog integration —
LogTideProcessorforwards structlog events to LogTide (from logtide_sdk.structlog import LogTideProcessor). Maps log levels, extracts non-reserved event fields into metadata, and serializes exceptions fromexc_info.structlogis not a hard dependency. - Robust JSON encoder (
logtide_json_dumps) used for both payload-size calculation and the request body. Metadata with non-JSON-serializable values no longer raises at flush time — Pydantic models, dataclasses, attrs classes, sets,datetime/date/time,Decimal,UUID,bytes, IP addresses,Path, enums, generators, andpandas/numpyobjects are handled, with circular references and unknown types degrading gracefully torepr().
Changed
- BREAKING: Dropped Python 3.8 and 3.9 (both EOL). Minimum is now Python 3.10.
- Internal imports converted from relative to absolute throughout the package.
Contributors
- @apelsynca — #5
Full Changelog: v0.8.5...v0.9.0
v0.8.5
What's Changed
Fixed
- 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
New Contributors
- @TomatoInOil made their first contribution in #4
Full Changelog: v0.8.4...v0.8.5
v0.8.4
[0.8.4] - 2026-03-21
Added
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
Changed
- 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 — importing
logtide_sdk.middlewareno longer fails if only a subset of frameworks are installed
Fixed
- Flask, Django, and FastAPI middleware
_log_errormethods were passing raw
Exceptionobjects 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