Rustelo/admin/lib/logs.nu
Jesús Pérez 642998ba35
chore: update
2026-07-18 20:15:23 +01:00

103 lines
3.2 KiB
Text

# Log fetch commands for the NATS admin bus.
#
# Fetches recent in-process log lines captured by the Rustelo `NatsLogLayer`
# tracing subscriber. Lines are returned in chronological order.
use ./common.nu [build-admin-subject, nats-admin-request]
# Fetch recent log lines from the server's in-memory ring buffer.
#
# Returns a list of strings (one per log line) in chronological order.
#
# Examples:
# nats-admin logs # last 100 lines
# nats-admin logs --lines 50 # last 50 lines
# nats-admin logs | where $it =~ "ERROR" # filter in-shell
export def "nats-admin logs" [
--lines: int = 100 # Number of recent lines to fetch (max 2000)
--url: string = "" # NATS server URL override
--creds: string = "" # Credentials file override
] {
let subject = build-admin-subject "admin.logs"
let payload = { lines: $lines } | to json --raw
nats-admin-request $subject $payload --url $url --creds $creds --timeout "10s"
| from json
| get lines
}
# Parse log lines into a table with level, target, and message columns.
#
# Line format produced by the Rust NatsLogLayer:
# [LEVEL] target — message
#
# Examples:
# nats-admin logs table
# nats-admin logs table --lines 200 | where level == "ERROR"
export def "nats-admin logs table" [
--lines: int = 100
--url: string = ""
--creds: string = ""
] {
nats-admin logs --lines $lines --url $url --creds $creds
| each { |line|
let parts = $line | parse --regex '^\[(?P<level>\w+)\] (?P<target>[^ ]+) — (?P<message>.+)$'
if ($parts | is-not-empty) {
$parts | first
} else {
{ level: "UNKNOWN", target: "", message: $line }
}
}
}
# Show only error and warning log lines.
#
# Examples:
# nats-admin logs errors
# nats-admin logs errors --lines 500
export def "nats-admin logs errors" [
--lines: int = 500
--url: string = ""
--creds: string = ""
] {
nats-admin logs --lines $lines --url $url --creds $creds
| where { |line| ($line | str contains "[ERROR]") or ($line | str contains "[WARN]") }
}
# Poll logs repeatedly and print new lines since the last fetch.
#
# Runs until interrupted with Ctrl-C.
#
# Examples:
# nats-admin logs tail
# nats-admin logs tail --interval 3 --lines 30
export def "nats-admin logs tail" [
--interval: int = 5 # Poll interval in seconds
--lines: int = 50 # Lines per fetch (keep small for tail use)
--url: string = ""
--creds: string = ""
] {
mut last_seen: string = ""
loop {
let batch = nats-admin logs --lines $lines --url $url --creds $creds
let new_lines = if ($last_seen | is-empty) {
$batch
} else {
let pivot = $batch | enumerate | where { |it| $it.item == $last_seen } | last?
if $pivot != null {
$batch | skip ($pivot.index + 1)
} else {
$batch
}
}
if ($new_lines | is-not-empty) {
$new_lines | each { |line| print $line }
$last_seen = ($new_lines | last)
}
sleep ($interval * 1sec)
}
}