Level set once at startup (Node, no hot-reload needed)
Rotating file log: max 10 MB, 5 files
Path: var/log/{NODE_ENV}.log (configurable)
Dual output: file + console simultaneously
IP anonymisation: active by default, full IPs only when DEBUG=true
IPv4: last octet β 0
IPv4-mapped IPv6: last octet β 0
IPv6: last group β 0
GDPR: no personally identifiable data when LOG=false
Additional exports (server)
1
import logger from'@xpulse/logger/server';
2
3
logger.formatIp(ip); // anonymised or full depending on DEBUG
4
logger.startup({ port }); // log startup summary
Log format (server)
1
[2026-03-09T10:23:45.123Z] (info ) xPulse Web started | ENV=production | PORT=3000
2
[2026-03-09T10:23:46.001Z] (info ) GET /privacy/ 200 12ms
3
[2026-03-09T10:23:47.220Z] (warn ) health check failed | source=chat
Package Structure
1
@xpulse/logger/
2
client.js β browser variant
3
server.js β Node variant
4
levels.js β shared level constants (internal)
5
README.md
6
package.json
Debug Integration
When @xpulse/debug is installed as a devDependency, @xpulse/logger
automatically provides a DataCollector. @xpulse/debug discovers it via
node_modules/@xpulse/logger/src/datacollectors/ β no configuration needed.
1
"optionalDependencies":{
2
"@xpulse/debug":"^1.0.0"
3
}
The LoggerCollector (name: 'logger', icon: 'π') shows in the Web Profiler:
Log Lines (logger-lines): all log entries for this request, newest first β
formatted as [timestamp] (level) [module] message | data
Log Files (table): snapshot of files under var/log/ with file size