Flow Studio
Log Entry Anatomy
Each row in the Logs tab represents one NodeLogEmitted SignalR event. Understanding the fields helps you read the stream efficiently and use the filter and search tools effectively.
NodeLogEmitted Payload
{
executionId: string;
nodeId: string;
level: 'debug' | 'info' | 'warn' | 'error' | 'critical';
message: string;
data: object | null; // structured data attached to the log
timestamp: string; // ISO 8601 with milliseconds
traceId: string; // OpenTelemetry trace ID
}
Row Column Reference
| Column | Source Field | Display Format |
|---|---|---|
| Timestamp | timestamp | HH:MM:SS.mmm (local time) |
| Level badge | level | Colour-coded chip: DEBUG/INFO/WARN/ERROR/CRIT |
| Node name | nodeId → lookup name | The node's display name, not the raw ID |
| Message | message | Plain text, sanitized. Truncated to 200 chars with "…" if longer |
| Data preview | data | If data is present, a small JSON preview "{…}" appears at row end; click to expand |
Level Colours
| Level | Colour | CSS Variable |
|---|---|---|
| debug | Grey | #718096 |
| info | Blue | #60a5fa |
| warn | Amber | #fbbf24 |
| error | Red | #f87171 |
| critical | Dark Red | #dc2626 |
Emitting Logs from a Backend Executor
In a C# executor, logs are emitted via the standard ILogger injected through NodeExecutionContext:
// In ExecuteInternalAsync:
ctx.Logger.LogInformation("HTTP GET {Url} → {StatusCode}", url, response.StatusCode);
ctx.Logger.LogDebug("Response body: {Body}", body);
ctx.Logger.LogWarning("SMTP retry {Attempt}/{Max}: {Reason}", attempt, max, reason);
ctx.Logger.LogError(ex, "HTTP request failed after {Retries} retries", retryCount);
The NodeLogEmitted SignalR event is emitted by a custom ILoggerProvider that intercepts all logs written within the executor's execution scope.