Skip to content

Send Server application logs to stderr in every deployment path #618

Closed

Description

@rmcdaniel

Problem

On Kubernetes, the Server's application logs never reach the container's log stream. They go to a file inside each container, which kubectl logs and cluster log collectors can't see, which is lost on restart, and which grows without rotation.

  • The image doesn't set LOG_CHANNEL (Dockerfile), so Laravel's default applies: the stack channel writes through single to storage/logs/laravel.log.
  • Only the published Compose file sets LOG_CHANNEL: stderr. The Helm chart's ConfigMap and the raw k8s/ manifests set no log settings, and this applies to the API, worker and scheduler pods.
  • The chart's values suggest DW_LOG_FORMAT: "json", but nothing in the Server reads that variable.
  • The config reference lists Laravel logging settings but doesn't give the default destination or say how to get JSON output for log pipelines.

Reproduced with the published durableworkflow/server:2.10.1 image. With no LOG_CHANNEL, the resolved channel is stack (single), and an error logged through Laravel appears in storage/logs/laravel.log and not on stderr. With LOG_CHANNEL=stderr it appears on stderr and not in the file.

Acceptance criteria

  • Every published deployment path (the image's own default, Compose, the Helm chart and the raw manifests) sends Server application logs to stderr unless the operator chooses otherwise.
  • Operators can switch to structured JSON lines through a documented setting, and the chart's example uses a variable the Server actually reads.
  • A test or chart check shows an error logged by an API, worker and scheduler process with default chart values reaches the container's stderr.
  • The config reference states the default log destination, how to choose JSON output and how to change the level.

Activity

  1. added
    kind:defectA public product behavior is incorrect
    priority:P2Normal-priority product work
    status:readyReady for implementation
    on Oct 21, 2026
  2. rmcdaniel commented on Oct 21, 2026

    @rmcdaniel
    MemberAuthor

    Accepted as a product fix. The implementation will make stderr the image default, carry the same default through chart/raw deployment guidance, honor an operator-selected channel, and document Laravel’s existing LOG_STDERR_FORMATTER for JSON lines. DW_LOG_FORMAT will not be presented as a working setting. Qualification will exercise the real API, worker and scheduler role commands; source, built-image and published acceptance will remain distinct. Work is based on the now-merged image foundation #615, without native, shared-fixture, schema, dependency or frozen-actor changes.

  3. rmcdaniel commented on Oct 22, 2026

    @rmcdaniel
    MemberAuthor

    Delivered in published Server 2.11.0 / Helm 0.3.0.

    • Qualified source 36d1627, tree e5821c4e9fae5ae9fd56deccd7f8370d3f935afd. The default image, Compose, Helm and raw manifests now select stderr; operators retain their explicit override.
    • Immutable image index sha256:b29157eb2cf844916debbbb3c01b3257672e0dece778a9c6fa539043a3038f02, local amd64 configuration sha256:d198219f7982b704f4149cdd99cef4e92bef4b3100a77332190bdc44fa87cfd9. PHP is 8.3.36 and the released Core is 2.10.1.
    • Publisher 39711732965 passes both immutable-image and matching OCI chart publication. Its actual published-image first-run check runs eight logging cases: API/queue/scheduler with default and JSON output, explicit file override and level filtering. The probe requires the actual role to invoke Laravel's default logger and checks stderr versus stdout/file, plus structured records. Published-image TLS/certificate-refusal, source-free bootstrap and protocol checks also pass.
    • Source chart/kind checks and all 28 local Helm controls passed before merge. Website #352 delivered logging/configuration guidance in all eight locales. The supported JSON setting is the real LOG_STDERR_FORMATTER; the unread chart example was corrected.

    This closes the logging obligation. The separate activity-lease installed-consumer qualification stays on Workflow #878; no Cloud deployment or native release is implied. The optional evidence ZIP download timed out on the Azure delivery path, so no independent ZIP-content audit is claimed. The linked publisher's actual checks and the independently pulled immutable image identities are the evidence here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind:defectA public product behavior is incorrectpriority:P2Normal-priority product workstatus:readyReady for implementation

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions