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.
- Fixed
Deprecated: Constant E_STRICT is deprecated since 8.4, the error level was removednotices emitted on PHP 8.4 and 8.5.ErrorListenerIntegration::severityToLevel()andErrorSerializer::errorLevelToString()still referencedE_STRICT. Both arematcharms evaluated lazily, so the constant was only touched for notice and deprecation level diagnostics, which is why every such diagnostic produced two extra deprecation lines. Because the deprecation is raised from inside the error handler and PHP does not re-enter a user handler while it is already running, those lines were printed by PHP itself instead of being captured, polluting responses whendisplay_errorsis on. TheE_STRICTlevel was removed in PHP 8.0 and this package requires^8.1, so both branches were unreachable and removing them changes no behaviour. It also avoids a fatalUndefined constant "E_STRICT"inside the error handler on PHP 9.0. Closes #7. - Removed a
ReflectionProperty::setAccessible()call from the test suite, deprecated in PHP 8.5 and a no-op since 8.1.
phpunit.xmlnow setsfailOnDeprecation="true"and CI runs the test matrix on PHP 8.5 as well, so this class of issue breaks the build instead of passing silently.
sample_rateoption (0.0–1.0, default 1.0): per-entry log sampling, applied afterbefore_send(traces_sample_ratekeeps governing spans)
- Every entry now carries
metadata.sdk = {"name": "logtide-php", "version": ...}(LogTide\Version; caller-providedsdkkey wins)
- Fixed
Options::$servicebeing silently ignored for any log captured without an explicit per-call service.Client::prepareEventused$event->getService() ?: $this->options->getService(), butEvent::__constructdefaults$serviceto the string'unknown', which is truthy — so the Elvis operator never fell through to the option. As a result, calls likeLogtideSdk::init(['service' => 'my-php-app'])followed bycaptureLog(...)always shippedservice: "unknown". The fallback now triggers when the event service is''or'unknown'. Closes #7.
- Fixed
Event::$timeformatting that produced ISO 8601 with a numeric offset (e.g.2026-04-07T11:34:24+00:00) viaformat('c'). Logtide's backend uses Zod's strictz.string().datetime(), which only accepts ISO 8601 ending inZ, so everycaptureLog(...)call was rejected with HTTP 400 "Validation error". The SDK now emits UTC ISO 8601 with aZsuffix (2026-04-07T11:34:24.886Z). Closes #180. - Fixed empty
metadatafield being serialized as JSON array[]instead of object{}. The backend schema ismetadata: z.record(z.unknown()).optional(), which rejects arrays with "Expected object, received array". DefaultcaptureLog(...)calls without any metadata now serializemetadataas an empty JSON object via\stdClass, so the first-time-user happy path validates cleanly. - Fixed OTLP
startTimeUnixNano,endTimeUnixNano, and span eventtimeUnixNanobeing emitted in scientific notation (e.g."1.7755623882398E+18") due to a naive(string) ($float * 1e9)cast. OTLP requires a digit-only stringifieduint64, which would cause the OTLP traces endpoint to reject the payload. The SDK now usessprintf('%.0f', ...)to emit a fixed-point integer string.
0.7.2 - 2026-03-19
- Fixed
ErrorListenerIntegrationclosure return type from: boolto?bool— the previous error handler can returnnull, causing aTypeErrorat runtime. Closes #6. - Added typed callable shapes via PHPDoc to
Options::$beforeSend,Options::$beforeBreadcrumb, andOptions::$integrationsso PHPStan can validate callback signatures at static analysis time. - Tightened
Scope::$eventProcessorsandScope::$globalEventProcessorsPHPDoc fromcallable[]toarray<callable(Event): ?Event>, and annotatedaddEventProcessor/addGlobalEventProcessoraccordingly.
0.7.1 - 2026-03-19
- Fixed
^0.1version constraint onlogtide/logtidein all integration packages — Composer treats^0.1as>=0.1.0 <0.2.0, sov0.7.0was not installable. Constraint updated to^0.7inlogtide-laravel,logtide-symfony,logtide-slim, andlogtide-wordpress. Closes #5.
0.7.0 - 2026-03-06
- Restructured as Composer monorepo with 5 packages under
packages/* - Unified test suite with PHPUnit 10.5 (265 tests, 570 assertions)
- PHPStan level 8 static analysis across all packages
- PSR-12 code style enforcement with PHP_CodeSniffer
LogtideSdk- static entry point for SDK initializationClientBuilder- fluent client construction with sensible defaultsClient- capture logs, errors, breadcrumbs, and spansHub- global singleton for convenient access across your appScope- per-request context isolation with tags, extras, and breadcrumbsBatchTransport- automatic batching with retry logic and circuit breakerHttpTransportandOtlpHttpTransportfor log and span deliveryCurlHttpClientandGuzzleHttpClientHTTP client implementations- DSN parsing, error serialization, trace ID generation
- W3C Trace Context (
traceparent) propagation - Breadcrumb buffer with configurable max size
- Monolog handlers:
LogtideHandlerandBreadcrumbHandler - PSR-15 middleware for generic HTTP request tracing
- Global helper functions (
\LogTide\init(),\LogTide\captureException(), etc.) - Built-in integrations: Request, Environment, ExceptionListener, ErrorListener, FatalErrorListener
LogtideServiceProviderwith auto-discovery and publishable configLogtideMiddlewarefor automatic request tracingLogChannelfor Laravel logging integrationLogtideFacadefor static access- Breadcrumb integrations: DB queries, cache operations, queue jobs
LogtideBundlewith DI extension and semantic configurationRequestSubscriberfor automatic HTTP request tracingConsoleSubscriberfor CLI command tracingSymfonyIntegrationandDoctrineIntegrationfor breadcrumbs
LogtideMiddleware- PSR-15 middleware for request tracingLogtideErrorMiddleware- error capture with full request context- Automatic route pattern resolution from Slim routing
LogtideWordPress- static initializer with WordPress hook registration- Lifecycle hooks:
wp_loaded,shutdown,wp_die_handler,wp_redirect,wp_mail WordPressIntegration- PHP error handler integrationDatabaseIntegration- slow query breadcrumbs via$wpdbHttpApiIntegration- outgoing HTTP request breadcrumbs- Multisite support (blog switch tracking, plugin activation/deactivation)
- GitHub Actions CI: PHPUnit tests, PHPStan, PHPCS on push/PR to
main/develop - GitHub Actions publish: Packagist publish on tag
v*.*.*or manual dispatch - PHP version matrix: 8.1, 8.2, 8.3, 8.4
- Branch model:
develop→main, hotfix directly tomain
- README for every package with badges, quick start, API reference
- Root README with package table, architecture diagram, development guide
- Contributing guide, Code of Conduct, Changelog
- Branch protection documentation (
.github/BRANCH_PROTECTION.md)
0.1.0 - 2026-01-13
- Initial release of LogTide PHP 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)
- Aggregated statistics API
- Trace ID context for distributed tracing
- Global metadata support
- Structured error serialization
- Internal metrics tracking
- Logging methods: debug, info, warn, error, critical
- Laravel middleware for auto-logging HTTP requests
- Symfony event subscriber for auto-logging HTTP requests
- PSR-15 middleware for Slim, Mezzio, and other frameworks
- Full PHP 8.1+ support with strict types and enums