@untools/logger
Version:
An enhanced logger for JavaScript/TypeScript that handles DOM elements and circular references
93 lines (67 loc) • 3.01 kB
Markdown
# @untools/logger
An enhanced, context-aware logger for JavaScript/TypeScript designed for **Wide Events** and **Canonical Log Lines**. It features premium aesthetics for both Node.js and Browser environments, handles DOM elements, and safely manages circular references.
Inspired by [Logging Sucks](https://loggingsucks.com) and the philosophy of observability wide events.
## Features
- 🚀 **Wide Events**: Consolidation of request context into single, rich log lines.
- 🔗 **Context Accumulation**: Persistent metadata that follows your execution flow.
- 👶 **Child Loggers**: Easily create request-scoped loggers with inherited context.
- 🎨 **Premium Aesthetics**: High-contrast dark theme for Terminal; modern, clean CSS for Browser.
- 🧩 **DOM Support**: Specialized formatting for DOM elements (Browser only).
- 🔄 **Circular Safety**: Robust handling of circular references in objects.
- 🛠 **Environment Aware**: Automatic inclusion of `_ts`, `_env`, and `_pid` metadata.
## Best Practices
This logger is built to support **Wide Events** (Canonical Log Lines). Instead of scattering log lines throughout your handler, accumulate context and emit a single structured event at completion.
### 1. Initialize Context
Start a "service hop" by creating a child logger with request context.
```typescript
import { logger } from '@untools/logger';
const requestLogger = logger.child({
_rid: 'req_a7b2...', // Request ID
userId: 'user_123',
path: '/api/checkout'
});
```
### 2. Accumulate Business Context
Add context as it becomes available during process execution.
```typescript
requestLogger.addContext({
cart_value: 2499,
item_count: 3,
subscription: 'premium'
});
```
### 3. Emit at Completion
Use a `finally` block or completion handler to emit the final wide event.
```typescript
try {
// ... business logic
requestLogger.info({ outcome: 'success', status_code: 200 });
} catch (error) {
requestLogger.error({ outcome: 'error', error: error.message });
}
```
## Usage
### Server (Node.js)
The server output uses premium ANSI color coding and bold keys for high readability in dark terminals.
```typescript
logger.info("Server started", { port: 3000 });
```
### Browser
In the browser, logs are beautifully styled with CSS and include collapsed groups for raw object inspection.
```typescript
logger.debug("Component mounted", { props, state });
```
### Log Levels
Default level is `INFO` (2). Change it via:
```typescript
import { LogLevel } from '@untools/logger';
logger.setLogLevel(LogLevel.DEBUG); // 3
```
## Credits & References
Special thanks to **Boris Tane** ([@boristane](https://github.com/boristane)) for the foundational concepts of Wide Events and Canonical Log Lines.
Key References:
- [Logging Sucks](https://loggingsucks.com)
- [Observability Wide Events 101](https://boristane.com/blog/observability-wide-events-101/) by Boris Tane
- [Stripe - Canonical Log Lines](https://stripe.com/blog/canonical-log-lines)
## License
MIT