* Avoid null endpoint DTO metadata in tests * Enforce console logs hub read permission * Remove unused console logs hub import * Support mapped endpoint metadata in auth tests * Reduce console log capture throughput impact * Address Copilot console logs review * Refactor task scheduling to support tenant-level background work and enhance logging functionality. * Introduce ConsoleStreamHook for stdout/stderr tee and enhance logging validation. Adjust test cases and startup warnings for distributed lock provider usage. * Refactor console logging pipeline with capture optimization and new ConsoleLogsHost; update tests accordingly. * Add Ansi SGR parser for console logs and associated unit tests * Remove ANSI color renderings and parsers; integrate ConsoleLogScopeAccessor for improved logging context with workflow instance ID support. * Address console logs code quality feedback * Address PR review feedback * Preserve console logs extension points * Stabilize console logs host lifecycle * Address final automated review comments * Tighten console log capture shutdown * Address console log review feedback * Address follow-up review feedback * Cover final review feedback * Avoid recursive console provider initialization * Guard console host lease shutdown * Preserve console log scope and provider lifetime * Correlate console log scope fallback * Tighten console scope correlation * Expose host services during provider construction * Redact ANSI-normalized console lines * Remove `ConsoleCaptureTee` and related services and tests * Use pipeline contributors for console log context * Update CShells package versions to 0.0.24-preview.132 * Filter live console logs by workflow instance * Enhance console logging with activity execution metadata and extend test coverage. * Address console logs stream consumption comment
5.4 KiB
Diagnostics Console Logs
Elsa.Diagnostics.ConsoleLogs is an opt-in module that hosts ConsoleLogStream.Core, adds Elsa workflow metadata, and streams recent plus live console output to authorized callers over REST and SignalR. It is intentionally separate from Elsa.Diagnostics.StructuredLogs; the two modules cover different diagnostic surfaces.
Start in src/modules/Elsa.Diagnostics.ConsoleLogs.
Scope
This module captures raw process console output only. It does not parse ILogger records, write to durable audit storage, call orchestrator log APIs, or implement trace or metric exploration. For semantic ILogger capture see Diagnostics Structured Logs.
Feature Wiring
- registers FastEndpoints assembly
- calls
AddConsoleLogsServices - adds FastEndpoints from the module
AddConsoleLogsServices registers:
- SignalR
ConsoleLogStream.Core.Options.ConsoleLogOptions- host-owned
ConsoleLogStream.Coreprovider, source registry, redaction pipeline, formatter, capture services, and hosted service ConsoleLogContextAccessorfor ambient workflow metadata- subscription manager
The core hosted service initializes the process-wide ConsoleLogStream.Core.ConsoleLogStreamHost. Original stdout and stderr destinations are preserved by the core capture hook.
Core Contracts
| Contract | Purpose |
|---|---|
ConsoleLogStream.Core.IConsoleLogCapture |
Capture pipeline entry point. |
ConsoleLogStream.Core.IConsoleLogProvider |
Provider used by endpoints and subscription manager. |
ConsoleLogStream.Core.IConsoleLogSourceRegistry |
Tracks source metadata and health. |
ConsoleLogStream.Core.IConsoleLogRedactionPipeline |
Runs registered redactors before buffering and streaming. |
ConsoleLogStream.Core.IConsoleLogDroppedLineReporter |
Reports dropped-line counts when buffers overflow. |
Event Flow
Captured console writes pass through redaction before reaching any consumer:
sequenceDiagram
participant Console as Process stdout/stderr
participant Hook as ConsoleLogStreamHost
participant Original as Original TextWriter
participant Pipeline as Core redaction pipeline
participant Provider as Core provider
participant Manager as ConsoleLogStream.SignalR subscription manager
participant Hub as ConsoleLogStream.SignalR hub
participant Client as Authorized caller
Console->>Hook: write bytes/chars
Hook->>Original: pass through (preserved)
Hook->>Pipeline: redact line and metadata
Pipeline->>Provider: publish redacted line
Provider->>Manager: live subscription event
Manager->>Hub: live event
Hub->>Client: SignalR stream
Client->>Provider: recent query through REST
REST And SignalR Surface
REST endpoints:
POST /elsa/api/diagnostics/console-logs/recentGET /elsa/api/diagnostics/console-logs/sources
Endpoint code is under Endpoints/ConsoleLogs.
SignalR:
- Hub:
ConsoleLogStream.SignalR.ConsoleLogsHub - Route:
/elsa/hubs/diagnostics/console-logs - Mapping: MapConsoleLogsHub
- App extension: UseConsoleLogs
Authorization
All endpoints and the SignalR hub require read:diagnostics:console-logs, defined in ConsoleLogsPermissions.
Safety Boundaries
- Redaction runs in
ConsoleLogStream.Corebefore recent buffering, live streaming, and endpoint responses. - ANSI escape sequences are preserved by default; set
PreserveAnsi = falseto strip them server-side. - Partial writes (no trailing newline) are buffered until the line completes, reaches the maximum line length, or an idle flush occurs.
- Lines longer than
MaxLineLengthare truncated to one event and marked as truncated. - Dropped-line counts are reported through
ConsoleLogStream.Core.IConsoleLogDroppedLineReporterwhen buffers or subscriber queues overflow.
Configuration
services.AddElsa(elsa =>
{
elsa.UseConsoleLogs(options =>
{
options.RecentCapacity = 5_000;
options.SubscriberCapacity = 1_000;
options.MaxRecentQuerySize = 1_000;
options.MaxLineLength = 16_384;
options.PreserveAnsi = true;
});
});
Map the live hub after routing is configured:
app.UseConsoleLogs();
Design Spec
specs/006-diagnostics-console-logs/spec.md defines requirements for capture, buffering, endpoints, SignalR, permissions, source identity, and redaction.
Tests
- test/unit/Elsa.Diagnostics.ConsoleLogs.UnitTests: module registration and naming.
- test/integration/Elsa.Diagnostics.ConsoleLogs.IntegrationTests: module registration, endpoint authorization, SignalR hub behavior, and recent query endpoint.
ConsoleLogStream.Coretests cover capture, filtering, redaction, buffering, source registry, and providers.