logd_network
Network-based sinks and live observability handlers for logd.
Features HTTP batch shipping with exponential backoff retries, real-time WebSocket log streaming with automatic reconnection buffering, and an embedded local HTTP/WebSocket browser dashboard (HttpDashboardHandler / HttpServerSink).
Installation
Add logd and logd_network to your pubspec.yaml:
dependencies:
logd: ^latest_version
logd_network: ^latest_version
Quick Start
Use the pre-wired HttpDashboardHandler to host a local real-time browser logging dashboard with zero setup:
import 'package:logd/logd.dart';
import 'package:logd_network/logd_network.dart';
void main() {
final dashboard = HttpDashboardHandler(
port: 8080,
title: 'Production Telemetry Stream',
bufferCapacity: 200,
);
Logger.configure('app', handlers: [dashboard]);
final logger = Logger.get('app.service');
logger.info('Server started cleanly.');
logger.warning('High memory pressure', context: {'usage': '87%'});
// Open http://localhost:8080 in your browser to view logs in real time!
}
Features & Component Overview
| Component | Type | Description |
|---|---|---|
HttpDashboardHandler |
TargetHandler | Pre-wired convenience handler for local browser log monitoring via HTTP/WebSocket (supports sync and .async() isolate mode). |
HttpSink |
Physical Sink | Accumulates logs in memory and ships in POST batches with exponential backoff retries. |
SocketSink |
Physical Sink | Streams logs frame-by-frame over WebSockets with offline reconnect buffering. |
HttpServerSink |
Physical Sink | Low-level server sink for hosting custom HTML/ANSI dashboards on custom ports. |
Platform Compatibility
| Component | Role | Android / iOS | Windows / macOS / Linux | Web / WASM | Notes |
|---|---|---|---|---|---|
HttpSink |
HTTP Client | Batch-posts logs to remote HTTP collector endpoints via package:http. |
|||
SocketSink |
WebSocket Client | Streams logs to remote WebSocket servers (ws://, wss://) via native & browser WebSockets. |
|||
HttpDashboardHandler |
HTTP/WS Server | ❌ | Binds a local server port on localhost. Throws UnsupportedError on Web. |
||
HttpServerSink |
HTTP/WS Server | ❌ | Embedded server for custom HTML/ANSI dashboards. Throws UnsupportedError on Web. |
1. HttpDashboardHandler (Embedded Browser Viewer)
Pre-wired, zero-configuration handler that boots a lightweight local HTTP and WebSocket server hosting an interactive real-time log viewer.
Platform Note: Designed for native/VM environments (server, desktop, CLI) where local TCP sockets can be bound. Throws
UnsupportedErroron Web platforms where hosting embedded servers is unsupported. For web apps, stream logs to an external collector withSocketSinkorHttpSink.
// Synchronous handler (runs server on main thread)
final dashboard = HttpDashboardHandler(
port: 8080,
title: 'Real-Time Observability Dashboard',
);
// Or run offloaded to a background isolate (zero UI latency)
final asyncDashboard = HttpDashboardHandler.async(
port: 8080,
title: 'Isolate Observability Stream',
);
Logger.configure('app', handlers: [dashboard]);
2. HttpSink (Batch Shipping & Exponential Retries)
Accumulates log entries in memory and posts them in batches to remote log aggregators (e.g. Datadog, Loggly, Vector, or custom HTTP ingestion endpoints).
final httpHandler = Handler(
formatter: const JsonFormatter(),
sink: HttpSink(
url: 'https://logs.example.com/api/v1/ingest',
headers: const {'Authorization': 'Bearer token-xyz'},
batchSize: 50,
flushInterval: const Duration(seconds: 30),
maxRetries: 5,
dropPolicy: DropPolicy.discardOldest,
),
);
Logger.configure('app', handlers: [httpHandler]);
Drop Policies:
DropPolicy.discardOldest: Evicts the oldest buffered entry when capacity is reached.DropPolicy.discardNewest: Rejects incoming entries when buffer is full.
3. SocketSink (Real-Time WebSocket Streaming)
Streams logs frame-by-frame over WebSockets with automatic reconnection and offline buffering.
Platform Note: Fully compatible across all platforms including Web and WASM via
package:web_socket_channel. In browser targets, it connects directly using native browser WebSockets (window.WebSocket).
final wsHandler = Handler(
formatter: const PlainFormatter(metadata: {LogMetadata.timestamp, LogMetadata.logger}),
decorators: const [StyleDecorator(), BoxDecorator()],
sink: SocketSink(
url: 'wss://stream.example.com/live-logs',
reconnectInterval: const Duration(seconds: 5),
),
);
Logger.configure('app.stream', handlers: [wsHandler]);
4. HttpServerSink (Low-Level Custom Dashboard Sink)
If you want to use custom formatters (like ToonFormatter), custom decorators, or custom encoders while hosting a local browser server, use HttpServerSink directly:
Platform Note: Supported on VM platforms only (server, desktop, CLI). Throws
UnsupportedErroron Web runtimes.
final serverSink = HttpServerSink(
address: 'localhost',
port: 8085,
encoder: const HtmlEncoder(title: 'Custom Terminal Stream'),
bufferCapacity: 500,
);
final customHandler = Handler(
formatter: const ToonFormatter(),
sink: serverSink,
);
Logger.configure('custom', handlers: [customHandler]);
Cross-Isolate Serialization
If transferring logger configurations to background worker isolates via Logger.exportConfig() and Logger.importConfig(), register network serializers in the worker isolate before importing:
import 'package:logd/logd.dart';
import 'package:logd_network/logd_network.dart';
void workerIsolateEntry(SendPort sendPort) {
// Register logd_network serializers
registerLogdNetworkSerializers();
// Import config passed from main isolate
Logger.importConfig(exportedJson);
}
Interactive CLI Examples Gallery
logd_network provides an interactive CLI showcase menu in example/main.dart:
# Run interactive CLI showcase menu
dart run example/main.dart
# Or run non-blocking automated summary
dart run example/main.dart 5
Or run individual standalone showcase scripts:
dart run example/showcase/http_sink_showcase.dart
dart run example/showcase/socket_sink_showcase.dart
dart run example/showcase/http_server_sink_showcase.dart
dart run example/showcase/http_dashboard_showcase.dart
Migration from logd <=0.9.7
In logd v0.10.0, all network transport sinks (NetworkSink, HttpSink, SocketSink, HttpServerSink, HttpDashboardHandler) were permanently removed from core package:logd.
- All network logging, HTTP batch shipping, and embedded dashboard capabilities are now exclusively provided by
package:logd_network. - Core
package:logdcontains zero network dependencies (e.g.package:http,package:web_socket_channel). - For detailed migration instructions, see the Migration Guide.
Documentation & Monorepo
For deep-dive documentation on logd architecture, migration guides, and execution engines:
License
This package is licensed under the BSD 3-Clause License. See the LICENSE file for details.
Libraries
- logd_network
- Network-based sinks and observability handlers (HTTP, WebSockets, Dashboard) for the logd engine.