2026-05-18 22:49:27 +00:00
# Diagnostics Console Logs
2026-05-26 22:14:28 +00:00
`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.
2026-05-18 22:49:27 +00:00
Start in [src/modules/Elsa.Diagnostics.ConsoleLogs ](../../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 ](diagnostics-structured-logs.md ).
## Feature Wiring
[ConsoleLogsFeature ](../../src/modules/Elsa.Diagnostics.ConsoleLogs/Features/ConsoleLogsFeature.cs ):
- registers FastEndpoints assembly
- calls `AddConsoleLogsServices`
- adds FastEndpoints from the module
[AddConsoleLogsServices ](../../src/modules/Elsa.Diagnostics.ConsoleLogs/Extensions/ServiceCollectionExtensions.cs ) registers:
- SignalR
2026-05-26 22:14:28 +00:00
- `ConsoleLogStream.Core.Options.ConsoleLogOptions`
- host-owned `ConsoleLogStream.Core` provider, source registry, redaction pipeline, formatter, capture services, and hosted service
- `ConsoleLogContextAccessor` for ambient workflow metadata
2026-05-18 22:49:27 +00:00
- subscription manager
2026-05-26 22:14:28 +00:00
The core hosted service initializes the process-wide `ConsoleLogStream.Core.ConsoleLogStreamHost` . Original stdout and stderr destinations are preserved by the core capture hook.
2026-05-18 22:49:27 +00:00
## Core Contracts
| Contract | Purpose |
| --- | --- |
2026-05-26 22:14:28 +00:00
| `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. |
2026-05-18 22:49:27 +00:00
## Event Flow
Captured console writes pass through redaction before reaching any consumer:
```mermaid
sequenceDiagram
participant Console as Process stdout/stderr
2026-05-26 22:14:28 +00:00
participant Hook as ConsoleLogStreamHost
2026-05-18 22:49:27 +00:00
participant Original as Original TextWriter
2026-05-26 22:14:28 +00:00
participant Pipeline as Core redaction pipeline
participant Provider as Core provider
participant Manager as ConsoleLogStream.SignalR subscription manager
participant Hub as ConsoleLogStream.SignalR hub
2026-05-18 22:49:27 +00:00
participant Client as Authorized caller
2026-05-26 22:14:28 +00:00
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
2026-05-18 22:49:27 +00:00
Manager->>Hub: live event
Hub->>Client: SignalR stream
2026-05-26 22:14:28 +00:00
Client->>Provider: recent query through REST
2026-05-18 22:49:27 +00:00
```
## REST And SignalR Surface
REST endpoints:
- `POST /elsa/api/diagnostics/console-logs/recent`
- `GET /elsa/api/diagnostics/console-logs/sources`
Endpoint code is under [Endpoints/ConsoleLogs ](../../src/modules/Elsa.Diagnostics.ConsoleLogs/Endpoints/ConsoleLogs ).
SignalR:
2026-05-26 22:14:28 +00:00
- Hub: `ConsoleLogStream.SignalR.ConsoleLogsHub`
2026-05-18 22:49:27 +00:00
- Route: `/elsa/hubs/diagnostics/console-logs`
- Mapping: [MapConsoleLogsHub ](../../src/modules/Elsa.Diagnostics.ConsoleLogs/Extensions/EndpointRouteBuilderExtensions.cs )
- App extension: [UseConsoleLogs ](../../src/modules/Elsa.Diagnostics.ConsoleLogs/Extensions/ApplicationBuilderExtensions.cs )
## Authorization
All endpoints and the SignalR hub require `read:diagnostics:console-logs` , defined in [ConsoleLogsPermissions ](../../src/modules/Elsa.Diagnostics.ConsoleLogs/Permissions/ConsoleLogsPermissions.cs ).
## Safety Boundaries
2026-05-26 22:14:28 +00:00
- Redaction runs in `ConsoleLogStream.Core` before recent buffering, live streaming, and endpoint responses.
- ANSI escape sequences are preserved by default; set `PreserveAnsi = false` to strip them server-side.
2026-05-18 22:49:27 +00:00
- Partial writes (no trailing newline) are buffered until the line completes, reaches the maximum line length, or an idle flush occurs.
- Lines longer than `MaxLineLength` are truncated to one event and marked as truncated.
2026-05-26 22:14:28 +00:00
- Dropped-line counts are reported through `ConsoleLogStream.Core.IConsoleLogDroppedLineReporter` when buffers or subscriber queues overflow.
2026-05-18 22:49:27 +00:00
## Configuration
```csharp
services.AddElsa(elsa =>
{
elsa.UseConsoleLogs(options =>
{
2026-05-26 22:14:28 +00:00
options.RecentCapacity = 5_000;
options.SubscriberCapacity = 1_000;
2026-05-18 22:49:27 +00:00
options.MaxRecentQuerySize = 1_000;
options.MaxLineLength = 16_384;
2026-05-26 22:14:28 +00:00
options.PreserveAnsi = true;
2026-05-18 22:49:27 +00:00
});
});
```
Map the live hub after routing is configured:
```csharp
app.UseConsoleLogs();
```
## Design Spec
[specs/006-diagnostics-console-logs/spec.md ](../../specs/006-diagnostics-console-logs/spec.md ) defines requirements for capture, buffering, endpoints, SignalR, permissions, source identity, and redaction.
2026-05-19 07:03:59 +00:00
## Tests
2026-05-26 22:14:28 +00:00
- [test/unit/Elsa.Diagnostics.ConsoleLogs.UnitTests ](../../test/unit/Elsa.Diagnostics.ConsoleLogs.UnitTests ): module registration and naming.
2026-05-19 07:03:59 +00:00
- [test/integration/Elsa.Diagnostics.ConsoleLogs.IntegrationTests ](../../test/integration/Elsa.Diagnostics.ConsoleLogs.IntegrationTests ): module registration, endpoint authorization, SignalR hub behavior, and recent query endpoint.
2026-05-26 22:14:28 +00:00
- `ConsoleLogStream.Core` tests cover capture, filtering, redaction, buffering, source registry, and providers.