You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
[0.8.4] - 2026-03-21
Added
AsyncLogTideClient: full async client using aiohttp with the same API as the
sync client — supports async with, await client.start(), and all logging,
flush, query, and stream methods as coroutines (pip install logtide-sdk[async])
LogTideHandler: standard logging.Handler for drop-in integration with Python's
built-in logging module — forwards records to LogTide with structured exception
metadata when exc_info=True is used
PayloadLimitsOptions: configurable safeguards against 413 errors — per-field size
cap, total entry size cap, named field exclusion, and automatic base64 removal
serialize_exception() exported at top level for use in custom integrations
payload_limits field on ClientOptions
Changed
BREAKING API paths updated to match v1 server contract:
POST /api/logs → POST /api/v1/ingest
GET /api/logs → GET /api/v1/logs
GET /api/logs/trace/{id} → GET /api/v1/logs/trace/{id}
GET /api/logs/stats → GET /api/v1/logs/aggregated
GET /api/logs/stream → GET /api/v1/logs/stream
BREAKING Auth header changed from Authorization: Bearer <key> to X-API-Key: <key>
BREAKING Error metadata key changed from "error" to "exception"; value is now a
structured object with type, message, language, stacktrace (array of {file, function, line} frames), and raw
BREAKINGstream() no longer blocks — it runs in a background daemon thread and
returns a Callable[[], None] stop function immediately
BREAKING Buffer overflow no longer raises BufferFullError; logs are silently
dropped and logs_dropped is incremented (BufferFullError class is kept for
backwards-compatible catch blocks)
requests.Session is now created once and reused across all HTTP calls for
connection reuse and reduced TCP overhead
datetime.utcnow() replaced with datetime.now(timezone.utc) throughout; LogEntry.time now includes +00:00 timezone suffix (ISO 8601 compliant)
Middleware __init__.py now uses per-framework try/except guards — importing logtide_sdk.middleware no longer fails if only a subset of frameworks are installed
Fixed
Flask, Django, and FastAPI middleware _log_error methods were passing raw Exception objects into the metadata dict instead of serializing them — exceptions
are now serialized via serialize_exception()
log() triggered flush() while holding _buffer_lock, causing a potential
deadlock under concurrent access — flush is now triggered outside the lock
__version__ in __init__.py was incorrectly set to "0.1.0" despite the
package being at 0.1.2