@e9n/pi-logger
Event bus logger for pi — writes structured JSONL logs from bus events
Package details
Install @e9n/pi-logger from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@e9n/pi-logger- Package
@e9n/pi-logger- Version
0.1.1- Published
- Apr 26, 2026
- Downloads
- 180/mo · 138/wk
- Author
- e9n
- License
- MIT
- Types
- extension
- Size
- 23.7 KB
- Dependencies
- 0 dependencies · 1 peer
Pi manifest JSON
{
"extensions": [
"./src/index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
@e9n/pi-logger
Event bus logger for pi. Subscribes to events on the shared event bus and writes structured JSONL log files, one per day.
Features
- Captures any event on the pi event bus as a structured log entry
- Writes JSONL files named
YYYY-MM-DD.jsonl, one per day - Global scope — all sessions write to
~/.pi/agent/logs/ - Project scope — logs write to
.pi/logs/next to project code - Configurable minimum level, event whitelist/ignore, and channel whitelist/ignore
- Level inferred from event name when not explicitly set
- Timestamps use the configured IANA timezone (defaults to system timezone)
- Runtime control via
/loggercommand — change level, scope, or reload settings without restarting
Setup / Settings
Add to ~/.pi/agent/settings.json (global) or .pi/settings.json (project):
{
"pi-logger": {
"level": "INFO",
"scope": "global",
"timezone": "Europe/Oslo",
"events_whitelist": ["log"],
"events_ignore": [],
"channels_whitelist": [],
"channels_ignore": []
}
}
| Key | Default | Description |
|---|---|---|
level |
"INFO" |
Minimum log level: DEBUG, INFO, WARN, ERROR. |
scope |
"global" |
"global" → ~/.pi/agent/logs/, "project" → .pi/logs/. |
timezone |
System tz | IANA timezone for timestamps (e.g. "Europe/Oslo"). |
events_whitelist |
["log"] |
Bus event prefixes to subscribe to. [] = capture all known events. |
events_ignore |
[] |
Bus event prefixes to skip (applied after whitelist). |
channels_whitelist |
[] |
Channels to accept in the log handler. [] = all. |
channels_ignore |
[] |
Channels to drop in the log handler. |
Logging from extensions
Emit structured log entries via the "log" bus event:
// Channel + level
pi.events.emit("log", { channel: "myext", level: "WARN", data: { msg: "something odd" } });
// Channel + sub-event
pi.events.emit("log", { channel: "myext", event: "request", data: { path: "/api" } });
// Shorthand by level (level inferred from event name)
pi.events.emit("log:error", { event: "myext:crash", data: { message: "oops" } });
pi.events.emit("log:warn", { event: "myext:slow", data: { ms: 2000 } });
Level inference
Events are assigned a level from their name when no explicit level is given:
| Pattern in event name | Level |
|---|---|
error or fail |
ERROR |
warn or alert |
WARN |
debug |
DEBUG |
| Anything else | INFO |
Log format
Each line is a JSON object:
{"ts":"2026-02-12T11:24:17.123+01:00","level":"INFO","channel":"heartbeat","event":"result","data":{"ok":true,"durationMs":3200}}
The bus event name is split on the first : into channel and event:heartbeat:result → channel: "heartbeat", event: "result"
Known bus events captured
channel:send/receive/register · cron:job_start/job_complete/add/remove/enable/disable/run/status/reload · heartbeat:check/result · jobs:recorded · web:mount/unmount/mount-api/unmount-api/ready · kysely:ready/ack
For events not in this list, use the log / log:* protocol above.
Commands
| Command | Description |
|---|---|
/logger or /logger status |
Show current settings and active subscription count |
/logger level <DEBUG|INFO|WARN|ERROR> |
Change minimum log level for the current session |
/logger scope <global|project> |
Change log scope for the current session |
/logger reload |
Reload settings from disk and resubscribe to events |
Install
pi install npm:@e9n/pi-logger
License
MIT