#debug-log #logging #nconsole

rconsole

A WebSocket-based logging library for Rust - send structured logs to NConsole desktop app

3 stable releases

new 1.1.0 Apr 8, 2026
1.0.1 Dec 20, 2024

#6 in #debug-log

MIT license

47KB
851 lines

RConsole

A WebSocket-based logging library for Rust — send structured log messages to the NConsole desktop app. Mirrors the API of the Flutter nconsole package.

Demo NConsole

Installation

Add dependency to Cargo.toml:

[dependencies]
rconsole = "1.0.1"

Desktop app download: NConsole

Quick Start

use rconsole::*;
use serde_json::json;

fn main() {
    // Point to your NConsole server
    NConsole::set_uri("192.168.1.100");

    // Log with mixed types — like console.log(a, b, c) in JavaScript
    nlog!("Hello from Rust!", 42, true, json!({"key": "val"}));
    ninfo!("Server started on port", 8080);
    nwarn!("Memory usage:", 85.5, "%");
    nerror!("Connection failed", json!({"code": 500}));

    // Grouped logging
    ngroup!("HTTP Request");
    nlog!("GET", "/api/users");
    nlog!("Status:", 200);
    ngroup_end!();

    // Collapsed group
    ngroup_collapsed!("Response Body");
    nlog!(json!({"users": [{"name": "Alex", "age": 25}]}));
    ngroup_end!();

    // Clear console
    nclear!();
}

API

Configuration

use rconsole::NConsole;

// Set WebSocket URI (auto-normalizes: adds ws:// and :9090 if needed)
NConsole::set_uri("192.168.1.100");     // → ws://192.168.1.100:9090
NConsole::set_uri("localhost:3000");     // → ws://localhost:3000
NConsole::set_uri("ws://example.com");  // → kept as-is

// Enable/disable logging
NConsole::set_enable(false); // disable (all log calls become no-ops)
NConsole::set_enable(true);  // enable

// Check status
let enabled = NConsole::is_enable();
let uri = NConsole::uri();
Macro Equivalent
nlog!(a, b, c) console.log(a, b, c)
ninfo!(a, b) console.info(a, b)
nwarn!(a, b) console.warn(a, b)
nerror!(a, b) console.error(a, b)
ngroup!("label") console.group("label")
ngroup_collapsed!("label") console.groupCollapsed("label")
ngroup_end!() console.groupEnd()
nclear!() console.clear()

Each argument can be any type that implements serde::Serialize — strings, numbers, bools, structs, serde_json::Value, etc.

#[derive(serde::Serialize)]
struct User { name: String, age: u32 }

let user = User { name: "Alex".into(), age: 25 };
nlog!("User logged in:", user);

Method API (homogeneous types only)

use rconsole::NConsole;

NConsole::log(&["Hello", "World"]);
NConsole::info(&["Server started"]);
NConsole::warn(&["High memory usage"]);
NConsole::error(&["Connection failed"]);
NConsole::group("Request #1");
NConsole::group_end();
NConsole::clear();

Log Listener

use rconsole::{NConsole, LogType};

NConsole::set_log_listener(|payload, log_type| {
    println!("[{:?}] {}", log_type, payload);
});

Log Types

Type Description
log Standard log message
info Informational message
warn Warning message
error Error message
group Start a named log group
groupCollapsed Start a collapsed log group
groupEnd End the current log group
clear Clear the console

Architecture

src/
├── lib.rs                    # Crate root, re-exports
├── macros.rs                 # nlog!, ninfo!, nwarn!, nerror!, etc.
├── domain/                   # Pure types (no dependencies)
│   ├── log_type.rs           # LogType enum
│   └── log_arg.rs            # LogArg enum
├── console/                  # Core logic
│   ├── uri.rs                # URI normalization
│   ├── client_info.rs        # ClientInfo struct
│   └── web_console.rs        # WebConsole singleton (thread-safe)
├── infrastructure/           # Transport
│   └── websocket.rs          # WsConnection wrapper
└── services/                 # Public API
    └── logger.rs             # NConsole façade

Thread Safety

All methods are thread-safe. The internal WebConsole singleton is protected by Mutex via once_cell::sync::Lazy.

Author

NghiNV

License

MIT

Dependencies

~4–10MB
~179K SLoC