* 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
123 lines
5.4 KiB
Markdown
123 lines
5.4 KiB
Markdown
# 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](../../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
|
|
- `ConsoleLogStream.Core.Options.ConsoleLogOptions`
|
|
- host-owned `ConsoleLogStream.Core` provider, source registry, redaction pipeline, formatter, capture services, and hosted service
|
|
- `ConsoleLogContextAccessor` for 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:
|
|
|
|
```mermaid
|
|
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/recent`
|
|
- `GET /elsa/api/diagnostics/console-logs/sources`
|
|
|
|
Endpoint code is under [Endpoints/ConsoleLogs](../../src/modules/Elsa.Diagnostics.ConsoleLogs/Endpoints/ConsoleLogs).
|
|
|
|
SignalR:
|
|
|
|
- Hub: `ConsoleLogStream.SignalR.ConsoleLogsHub`
|
|
- 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
|
|
|
|
- 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.
|
|
- 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.
|
|
- Dropped-line counts are reported through `ConsoleLogStream.Core.IConsoleLogDroppedLineReporter` when buffers or subscriber queues overflow.
|
|
|
|
## Configuration
|
|
|
|
```csharp
|
|
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:
|
|
|
|
```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.
|
|
|
|
## Tests
|
|
|
|
- [test/unit/Elsa.Diagnostics.ConsoleLogs.UnitTests](../../test/unit/Elsa.Diagnostics.ConsoleLogs.UnitTests): module registration and naming.
|
|
- [test/integration/Elsa.Diagnostics.ConsoleLogs.IntegrationTests](../../test/integration/Elsa.Diagnostics.ConsoleLogs.IntegrationTests): module registration, endpoint authorization, SignalR hub behavior, and recent query endpoint.
|
|
- `ConsoleLogStream.Core` tests cover capture, filtering, redaction, buffering, source registry, and providers.
|