dragon-code/laravel-http-logger
A Laravel package that automatically logs incoming HTTP requests and responses, capturing method, URL, status code, headers, and payloads for easier debugging, auditing, and monitoring of your application's traffic.
Architecture fit. Unchanged. The package remains a conventional Laravel middleware + service provider + publishable config that writes incoming request data through the Log facade into configured Monolog channels. It composes naturally with existing channel configuration (single, daily, stderr for containers, or a dedicated http channel) and slots into a standard HTTP kernel. The architectural caveat is also unchanged: it is duplicative — roughly 40–60 lines of first-party middleware achieves the same outcome, and it overlaps with Telescope, Laravel's request context, and APM tooling (Sentry, Datadog, New Relic). Its value is config-driven field selection and fast time-to-value, not unique capability.
Integration feasibility. Improved from low-to-moderate to moderate for production. The 1.6.0 release adds Laravel 13 compatibility, which materially changes the dependency calculus: the Composer constraint now spans the framework version we run and the next major, so the integration is no longer immediately pinned to an end-of-life matrix. Install, auto-discovery, vendor:publish, and middleware registration remain an under-an-hour developer experience.
The blocker narrows rather than disappears. The repository has been reported as archived, yet this release contains a human-authored merged PR (#28, Laravel 13 compatibility, by @andrey-helldar) alongside three bot commits (license year, preview, banner). That is contradictory signal and must be resolved before adoption: either the archive was lifted, or the maintainer is still cherry-picking merges into an archived repo. Feasible paths remain (a) fork and maintain internally, (b) vendor the source, (c) reimplement — but the urgency of choosing (a) drops, since a supported path now extends through Laravel 13.
Technical risk. The dominant risks are structural and were not addressed by 1.6.0. The release is a single compatibility patch plus housekeeping; there are no security fixes, no redaction features, no sampling controls, no Octane-safety statement, and no structured-output change.
Authorization, Cookie), query strings, and potentially bodies. Nothing in 1.6.0 adds verified masking or allow-listing. This remains a PII/PCI finding and a compliance incident waiting to happen, especially with a third-party aggregator sink.Key questions for the maintainer/sponsor.
Verdict: still a tactical borrowing of a pattern rather than a strategic dependency, but 1.6.0 removes the immediate forcing function. Acceptable to composer require behind our own adapter for the Laravel 13 cycle only if redaction, sampling, exclusions, and a named fork owner are in place; the fork-or-reimplement decision can be deferred to the Laravel 14 upgrade rather than made at adoption. Do not read the release as evidence of ongoing support — three of four changes are bot housekeeping.
Stack fit. Unchanged and now wider: a Laravel 9–13 monolith or API wanting a config-driven request log without building middleware. It slots as one middleware in the web/api groups and writes to any configured channel — stderr for containerized deployments feeding a log shipper, or a dedicated http channel with daily rotation for VM/bare-metal. Complementary to APM, not a substitute: APM gives traces and latency, this gives durable request records.
Migration path. Simplification versus the prior assessment: a fork-per-release is no longer mandatory up front. Recommended path is adapter-first, fork-on-trigger:
RequestLogMiddleware, with the fork created lazily — the trigger being Laravel 14 or any CVE/security report.Indirection is still the critical mechanic: keep the package's public surface small and depend on our wrapper, not the vendor namespace. That makes eventual replacement, forking, or reimplementation a config change rather than a refactor — and it lets us defer the fork decision without accruing integration debt. If we do fork, consume via a VCS repository entry in composer.json (or a private Packagist/Satis).
Compatibility. Verify the full matrix rather than trusting the release note: minimum and maximum supported PHP, the exact Laravel minor in production, and the presence of Octane, Horizon, or other long-running workers. The L13 claim deserves a specific check — confirm the package's test suite genuinely runs against Laravel 13 (and PHP 8.3/8.4), because a widened constraint without a green matrix converts a loud resolution failure into a silent runtime failure. Octane testing remains mandatory — middleware retaining state on a singleton bleeds request data across workers, a correctness and data-leak issue. Also confirm behavior under APP_DEBUG, queue workers, and health-check routes (exclude those from logging to avoid noise and cost).
Sequencing (roughly 2–3 weeks elapsed, ~1 week of engineering — unchanged).
Maintenance. The change here is scheduling, not magnitude. Archiving — if still in effect — continues to shift lifecycle cost in-house, but 1.6.0 defers the first forced engagement from the upcoming framework upgrade to the next one. Realistic budget remains 2–5 engineer-days per year in steady state, spiking to 1–2 weeks at each Laravel major; the difference is that we can now plan that spike rather than absorb it at adoption. Assign a named owner at adoption time regardless — an unowned dependency on an archived package is still a slow-motion outage, and an unowned fork of one is worse. A decision is owed by the Laravel 14 beta, whichever direction we choose.
Support. No upstream support, no issue triage commitment, no CVE pipeline — one human contributor merged one patch, which is goodwill rather than a support contract. Internal escalation only, so an SME must exist. Treat the source as the documentation; it remains small enough to read in an afternoon, which is the main reason the fork option stays cheap.
Scaling. Unchanged. Cost scales linearly with request volume and payload size — the wrong shape for high-RPS services. Mitigations: restrict to non-health, non-static routes; cap body capture length; sample (5–10% of successful requests, 100% of 4xx/5xx — errors are where the value is); ship via stderr to a managed aggregator rather than local disk; define retention up front (30 days is usually generous). At meaningful volume the storage and ingestion bill, not CPU, is the dominant cost — model it before rollout.
Failure modes to instrument for.
Authorization, Cookie, or raw bodies by default. Nothing in 1.6.0 mitigates this — it is entirely our control.Ramp-up. Unchanged and low: publish config, register middleware, read the config file. Half a day to first useful output, one to two days to production-grade with redaction, exclusions, and sampling. The learning curve is not the package — it is the ownership model. Document the fork trigger alongside the integration so the next engineer inherits a plan rather than a surprise.
Bottom line. 1.6.0 is a genuine but narrow improvement: it converts an immediate dependency dead-end into a two-major-cycle runway and resolves the "is this tag real?" ambiguity. It does not touch any of the compliance, sampling, or availability concerns, and three of its four changes are bot housekeeping — read it as a courtesy compatibility patch, not a revival. Adopt upstream 1.6.0 behind our own middleware adapter with redaction, sampling, and route exclusions configured before the first production byte, schedule the fork-or-reimplement decision for the Laravel 14 upgrade, and keep the ~50-line reimplementation as a live fallback rather than a hypothetical one.
How can I help you explore Laravel packages today?