@mks2508/better-logger 0.18.2-alpha.1 → 0.18.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -336
- package/dist/Logger.d.ts +356 -157
- package/dist/Logger.d.ts.map +1 -1
- package/dist/ScopedLogger.d.ts +549 -9
- package/dist/ScopedLogger.d.ts.map +1 -1
- package/dist/chunks/HookBridge-C-AvXmPD.cjs +504 -0
- package/dist/chunks/HookBridge-C-AvXmPD.cjs.map +1 -0
- package/dist/chunks/HookBridge-CI2PH79S.js +487 -0
- package/dist/chunks/HookBridge-CI2PH79S.js.map +1 -0
- package/dist/chunks/{LogContext-L7HzynFw.cjs → LogContext-BaMXleWj.cjs} +19 -4
- package/dist/chunks/LogContext-BaMXleWj.cjs.map +1 -0
- package/dist/chunks/LogContext-DZasm_P5.cjs +141 -0
- package/dist/chunks/LogContext-DZasm_P5.cjs.map +1 -0
- package/dist/chunks/{LogContext-Cwn-1Zzb.js → LogContext-DjlITOzZ.js} +19 -4
- package/dist/chunks/LogContext-DjlITOzZ.js.map +1 -0
- package/dist/chunks/LogContext-Dyzs61XG.js +136 -0
- package/dist/chunks/LogContext-Dyzs61XG.js.map +1 -0
- package/dist/chunks/SerializerBridge-Ba43Mk7j.js +393 -0
- package/dist/chunks/SerializerBridge-Ba43Mk7j.js.map +1 -0
- package/dist/chunks/SerializerBridge-C4a9Z37F.cjs +410 -0
- package/dist/chunks/SerializerBridge-C4a9Z37F.cjs.map +1 -0
- package/dist/chunks/{StyleManager-CIpd6wbO.cjs → StyleManager-DQ6UNRB-.cjs} +37 -11
- package/dist/chunks/StyleManager-DQ6UNRB-.cjs.map +1 -0
- package/dist/chunks/StyleManager-DjwAYbxE.js +113 -0
- package/dist/chunks/StyleManager-DjwAYbxE.js.map +1 -0
- package/dist/chunks/{core-PoT7RrTK.js → core-Blfi2klP.js} +1 -4
- package/dist/chunks/core-Blfi2klP.js.map +1 -0
- package/dist/chunks/{core-Dzz7agGa.cjs → core-CqS_UBzJ.cjs} +1 -4
- package/dist/chunks/core-CqS_UBzJ.cjs.map +1 -0
- package/dist/chunks/{environment-detector-CI3TrWK_.js → environment-detector-7NvnYUfr.js} +11 -11
- package/dist/chunks/environment-detector-7NvnYUfr.js.map +1 -0
- package/dist/chunks/{environment-detector-Cnn6wr6O.cjs → environment-detector-D-tHkKWA.cjs} +11 -11
- package/dist/chunks/environment-detector-D-tHkKWA.cjs.map +1 -0
- package/dist/chunks/server-fallback-CaCPjWby.cjs +119 -0
- package/dist/chunks/server-fallback-CaCPjWby.cjs.map +1 -0
- package/dist/chunks/server-fallback-jj0T6XaK.js +114 -0
- package/dist/chunks/server-fallback-jj0T6XaK.js.map +1 -0
- package/dist/chunks/{spinner-DNvxbM9a.cjs → spinner-BHyYEXsM.cjs} +319 -37
- package/dist/chunks/spinner-BHyYEXsM.cjs.map +1 -0
- package/dist/chunks/{spinner-D3FsF78o.js → spinner-BtkwpzYv.js} +319 -37
- package/dist/chunks/spinner-BtkwpzYv.js.map +1 -0
- package/dist/chunks/styling-CRw3KQW4.js +1592 -0
- package/dist/chunks/styling-CRw3KQW4.js.map +1 -0
- package/dist/chunks/styling-Cel2wPRy.cjs +1645 -0
- package/dist/chunks/styling-Cel2wPRy.cjs.map +1 -0
- package/dist/chunks/transports-BGfwwakw.js +1237 -0
- package/dist/chunks/transports-BGfwwakw.js.map +1 -0
- package/dist/chunks/transports-BZ-Mc2IT.cjs +1450 -0
- package/dist/chunks/transports-BZ-Mc2IT.cjs.map +1 -0
- package/dist/chunks/transports-DvaLAeGJ.js +1403 -0
- package/dist/chunks/transports-DvaLAeGJ.js.map +1 -0
- package/dist/chunks/transports-yK6CL0Ml.cjs +1278 -0
- package/dist/chunks/transports-yK6CL0Ml.cjs.map +1 -0
- package/dist/chunks/{utils-BqlFYocD.cjs → utils-W_cxqriN.cjs} +44 -37
- package/dist/chunks/utils-W_cxqriN.cjs.map +1 -0
- package/dist/chunks/{utils-VETbVpkR.js → utils-tKfBAWUM.js} +44 -37
- package/dist/chunks/utils-tKfBAWUM.js.map +1 -0
- package/dist/cli/CommandProcessor.d.ts +166 -19
- package/dist/cli/CommandProcessor.d.ts.map +1 -1
- package/dist/cli/commands/ConfigCommand.d.ts +36 -1
- package/dist/cli/commands/ConfigCommand.d.ts.map +1 -1
- package/dist/cli/commands/ExportCommand.d.ts +49 -3
- package/dist/cli/commands/ExportCommand.d.ts.map +1 -1
- package/dist/cli/commands/ThemeCommand.d.ts +62 -3
- package/dist/cli/commands/ThemeCommand.d.ts.map +1 -1
- package/dist/cli/help.d.ts +30 -2
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/index.d.ts +29 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli.cjs +2 -2
- package/dist/cli.js +2 -2
- package/dist/context/LogContext.d.ts +167 -70
- package/dist/context/LogContext.d.ts.map +1 -1
- package/dist/context.cjs +1 -1
- package/dist/context.js +1 -1
- package/dist/core.cjs +52 -29
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +50 -27
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +52 -29
- package/dist/core.js.map +1 -1
- package/dist/hooks/HookBridge.d.ts +15 -9
- package/dist/hooks/HookBridge.d.ts.map +1 -1
- package/dist/hooks/HookManager.d.ts +295 -2
- package/dist/hooks/HookManager.d.ts.map +1 -1
- package/dist/hooks.cjs +1 -1
- package/dist/hooks.js +1 -1
- package/dist/index.cjs +1415 -214
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1413 -215
- package/dist/index.js.map +1 -1
- package/dist/playground/TerminalBridge.d.ts +23 -16
- package/dist/playground/TerminalBridge.d.ts.map +1 -1
- package/dist/playground/box.d.ts +36 -5
- package/dist/playground/box.d.ts.map +1 -1
- package/dist/playground/cli-table.d.ts +41 -5
- package/dist/playground/cli-table.d.ts.map +1 -1
- package/dist/playground/divider.d.ts +22 -3
- package/dist/playground/divider.d.ts.map +1 -1
- package/dist/playground/header.d.ts +21 -4
- package/dist/playground/header.d.ts.map +1 -1
- package/dist/playground/server-fallback.d.ts +96 -9
- package/dist/playground/server-fallback.d.ts.map +1 -1
- package/dist/playground/spinner.d.ts +159 -10
- package/dist/playground/spinner.d.ts.map +1 -1
- package/dist/playground/step.d.ts +25 -6
- package/dist/playground/step.d.ts.map +1 -1
- package/dist/playground.cjs +1 -1
- package/dist/playground.js +1 -1
- package/dist/serializers/SerializerBridge.d.ts +13 -6
- package/dist/serializers/SerializerBridge.d.ts.map +1 -1
- package/dist/serializers/SerializerRegistry.d.ts +236 -0
- package/dist/serializers/SerializerRegistry.d.ts.map +1 -1
- package/dist/serializers.cjs +1 -1
- package/dist/serializers.js +1 -1
- package/dist/styles/StyleManager.d.ts +138 -31
- package/dist/styles/StyleManager.d.ts.map +1 -1
- package/dist/styles.cjs +2 -2
- package/dist/styles.js +2 -2
- package/dist/styling/SmartPresets.d.ts +100 -6
- package/dist/styling/SmartPresets.d.ts.map +1 -1
- package/dist/styling/StyleBuilder.d.ts +453 -32
- package/dist/styling/StyleBuilder.d.ts.map +1 -1
- package/dist/styling/banners.d.ts +83 -7
- package/dist/styling/banners.d.ts.map +1 -1
- package/dist/styling/themes.d.ts +41 -2
- package/dist/styling/themes.d.ts.map +1 -1
- package/dist/transports/ConsoleTransport.d.ts +95 -0
- package/dist/transports/ConsoleTransport.d.ts.map +1 -1
- package/dist/transports/FileTransport.d.ts +99 -18
- package/dist/transports/FileTransport.d.ts.map +1 -1
- package/dist/transports/HttpTransport.d.ts +135 -22
- package/dist/transports/HttpTransport.d.ts.map +1 -1
- package/dist/transports/OtlpTraceTransport.d.ts +118 -0
- package/dist/transports/OtlpTraceTransport.d.ts.map +1 -0
- package/dist/transports/OtlpTransport.d.ts +80 -37
- package/dist/transports/OtlpTransport.d.ts.map +1 -1
- package/dist/transports/SpanRuntime.d.ts +73 -0
- package/dist/transports/SpanRuntime.d.ts.map +1 -0
- package/dist/transports/TransportBridge.d.ts +19 -13
- package/dist/transports/TransportBridge.d.ts.map +1 -1
- package/dist/transports/TransportManager.d.ts +232 -10
- package/dist/transports/TransportManager.d.ts.map +1 -1
- package/dist/transports/index.d.ts +1 -0
- package/dist/transports/index.d.ts.map +1 -1
- package/dist/transports-module.d.ts +3 -1
- package/dist/transports-module.d.ts.map +1 -1
- package/dist/transports.cjs +2 -1
- package/dist/transports.js +2 -2
- package/dist/types/core.d.ts +155 -59
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/hooks.d.ts +92 -14
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/serializers.d.ts +72 -0
- package/dist/types/serializers.d.ts.map +1 -1
- package/dist/types/transports.d.ts +163 -39
- package/dist/types/transports.d.ts.map +1 -1
- package/dist/utils/ansi-colors.d.ts +15 -15
- package/dist/utils/asyncLocalStorage.d.ts +33 -0
- package/dist/utils/asyncLocalStorage.d.ts.map +1 -0
- package/dist/utils/environment-detector.d.ts +11 -11
- package/dist/utils/formatting.d.ts +8 -8
- package/dist/utils/output.d.ts +9 -9
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/stackTrace.d.ts +2 -2
- package/package.json +24 -25
- package/dist/chunks/HookBridge-CiRfR67f.cjs +0 -190
- package/dist/chunks/HookBridge-CiRfR67f.cjs.map +0 -1
- package/dist/chunks/HookBridge-SgMmbXZB.js +0 -173
- package/dist/chunks/HookBridge-SgMmbXZB.js.map +0 -1
- package/dist/chunks/LogContext-Cwn-1Zzb.js.map +0 -1
- package/dist/chunks/LogContext-L7HzynFw.cjs.map +0 -1
- package/dist/chunks/SerializerBridge-BaOQOb8q.cjs +0 -166
- package/dist/chunks/SerializerBridge-BaOQOb8q.cjs.map +0 -1
- package/dist/chunks/SerializerBridge-BkpQu5c9.js +0 -149
- package/dist/chunks/SerializerBridge-BkpQu5c9.js.map +0 -1
- package/dist/chunks/StyleManager-CIpd6wbO.cjs.map +0 -1
- package/dist/chunks/StyleManager-LCvVlVdx.js +0 -87
- package/dist/chunks/StyleManager-LCvVlVdx.js.map +0 -1
- package/dist/chunks/core-Dzz7agGa.cjs.map +0 -1
- package/dist/chunks/core-PoT7RrTK.js.map +0 -1
- package/dist/chunks/environment-detector-CI3TrWK_.js.map +0 -1
- package/dist/chunks/environment-detector-Cnn6wr6O.cjs.map +0 -1
- package/dist/chunks/server-fallback-BUKjdLS7.cjs +0 -42
- package/dist/chunks/server-fallback-BUKjdLS7.cjs.map +0 -1
- package/dist/chunks/server-fallback-BsuWH1Dk.js +0 -37
- package/dist/chunks/server-fallback-BsuWH1Dk.js.map +0 -1
- package/dist/chunks/spinner-D3FsF78o.js.map +0 -1
- package/dist/chunks/spinner-DNvxbM9a.cjs.map +0 -1
- package/dist/chunks/styling-84N8T97t.js +0 -941
- package/dist/chunks/styling-84N8T97t.js.map +0 -1
- package/dist/chunks/styling-Cg5saQ46.cjs +0 -994
- package/dist/chunks/styling-Cg5saQ46.cjs.map +0 -1
- package/dist/chunks/transports-BiDk345e.js +0 -715
- package/dist/chunks/transports-BiDk345e.js.map +0 -1
- package/dist/chunks/transports-COPWmlF1.cjs +0 -756
- package/dist/chunks/transports-COPWmlF1.cjs.map +0 -1
- package/dist/chunks/utils-BqlFYocD.cjs.map +0 -1
- package/dist/chunks/utils-VETbVpkR.js.map +0 -1
- package/dist/example.d.ts +0 -18
- package/dist/example.d.ts.map +0 -1
- package/dist/main.d.ts +0 -2
- package/dist/main.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -8,33 +8,15 @@
|
|
|
8
8
|
|
|
9
9
|
## ✨ Features
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
-
|
|
19
|
-
- 🔭
|
|
20
|
-
- 🔇 **Verbosidad filtrable** — `setVerbosity('warn')` filtra todo por debajo
|
|
21
|
-
|
|
22
|
-
### Log context (MDC)
|
|
23
|
-
- 🧩 **Contexto estructurado** — `withContext({ requestId, userId })` se mergea en cada `TransportRecord`
|
|
24
|
-
- 🧬 **Loggers hijuelos** — `child({ ... })` hereda contexto sin mutar al padre
|
|
25
|
-
- 🏷️ **Resource OTel** — `setResource({ 'service.name': ... })` por logger
|
|
26
|
-
|
|
27
|
-
### Transports
|
|
28
|
-
- 📁 **File** — async (`fs.promises`), bounded buffer, sanitización de path, fallback a `localStorage` en browser
|
|
29
|
-
- 🌐 **HTTP** — batching, retry con backoff, bounded buffer (sin OOM), status check
|
|
30
|
-
- 🔭 **OTLP → SigNoz** — payload OTLP/HTTP JSON spec-compliant, ingestion key desde env var (nunca hardcodeada)
|
|
31
|
-
- 🧩 **Custom** — implementa `ITransport` y registra con `addTransport()`
|
|
32
|
-
|
|
33
|
-
### Hooks, serializers y más
|
|
34
|
-
- 🪝 **Hooks** — `on('beforeLog', ...)` (awaited, soporta redacción PII) / `on('afterLog', ...)`
|
|
35
|
-
- 🔄 **Middleware** — pipeline `use((entry, next) => ...)`
|
|
36
|
-
- 🧬 **Serializers** — transforma tipos antes de loggear (`addSerializer(Error, fn)`)
|
|
37
|
-
- 🖥️ **CLI integrado** — spinners, boxes, tablas, steps, headers
|
|
11
|
+
- 🎨 **Styling dual** — CSS `%c` con gradientes y sombras en browser, ANSI en terminal. Themes (`default`/`dark`/`light`/`neon`/`minimal`/`cyberpunk`) y Smart Presets (`cyberpunk`/`glassmorphism`/`minimal`/`debug`/`production`).
|
|
12
|
+
- 📊 **6 niveles + verbosity** — `trace < debug < info < warn < error < critical` (+ `silent`). `trace` alineado con la banda TRACE de OpenTelemetry (severity 1-4).
|
|
13
|
+
- 🧩 **Log context (MDC)** — bindings persistentes con `child()` o scoped via `AsyncLocalStorage` con `withContext(bindings, fn)`. Se mergean en `TransportRecord.attributes`.
|
|
14
|
+
- 📡 **Transports** — `FileTransport` (async, bounded buffer), `HttpTransport` (batching + retry exponencial), `OtlpTransport` (OTLP/HTTP → SigNoz y otros backends). Custom via `ITransport`.
|
|
15
|
+
- 🪝 **Hooks awaited** — `beforeLog` (mutación reflejada en el mensaje), `afterLog` (métricas fire-and-forget), middleware Koa-style con `use()`. Ideales para redacción PII.
|
|
16
|
+
- 🧬 **Serializers por tipo** — `addSerializer(Error, fn)`, `addSerializer(User, fn)`. Defaults para `Error`/`Date`/`Map`/`Set`/`Buffer`/`RegExp`.
|
|
17
|
+
- 🏷️ **Scoped loggers** — `scope('Auth')`, `component('Database')`, `api('GraphQL')` con badges automáticos y métodos específicos (`slow`, `rateLimit`, `auth`, `deprecated`).
|
|
18
|
+
- 🖥️ **CLI primitives** — spinners braille 80ms, boxes ASCII, tablas, steps, headers, dividers. Fallback automático en non-TTY.
|
|
19
|
+
- 🔭 **OpenTelemetry ready** — `severityNumber` / `severityText` / `traceId` / `spanId` / `attributes` / `resource` en cada `TransportRecord`.
|
|
38
20
|
|
|
39
21
|
## 📦 Instalación
|
|
40
22
|
|
|
@@ -50,340 +32,60 @@ bun add @mks2508/better-logger
|
|
|
50
32
|
import logger from '@mks2508/better-logger';
|
|
51
33
|
|
|
52
34
|
logger.info('Application started');
|
|
53
|
-
logger.success('Database connected');
|
|
54
35
|
logger.warn('High memory usage');
|
|
55
36
|
logger.error('Connection failed');
|
|
56
|
-
|
|
57
|
-
|
|
37
|
+
|
|
38
|
+
// Loggers hijuelos (request-scoped, persistentes)
|
|
39
|
+
const requestLog = logger.child({ requestId: getRequestId() });
|
|
40
|
+
requestLog.info('auth ok'); // lleva requestId automáticamente
|
|
58
41
|
```
|
|
59
42
|
|
|
60
|
-
|
|
43
|
+
Más métodos sueltos:
|
|
61
44
|
|
|
62
45
|
```typescript
|
|
63
|
-
import { info,
|
|
46
|
+
import { info, success, error, trace } from '@mks2508/better-logger';
|
|
64
47
|
info('Proceso iniciado');
|
|
65
48
|
success('✓ Completado');
|
|
66
49
|
```
|
|
67
50
|
|
|
51
|
+
## 📚 Documentación
|
|
52
|
+
|
|
53
|
+
| Página | Cubre |
|
|
54
|
+
|---|---|
|
|
55
|
+
| [Inicio](docs/index.md) | Overview, features, instalación |
|
|
56
|
+
| [Transports](docs/transports.md) | `FileTransport`, `HttpTransport`, `OtlpTransport`, custom `ITransport` |
|
|
57
|
+
| [Log Context (MDC)](docs/context.md) | `child()` inmutable vs `withContext(bindings, fn)` scoped |
|
|
58
|
+
| [Hooks & Middleware](docs/hooks.md) | `on`/`once`/`off`/`use`, redacción PII, métricas |
|
|
59
|
+
| [Serializers](docs/serializers.md) | `addSerializer`, defaults, circular refs, depth |
|
|
60
|
+
| [Styling](docs/styles.md) | Themes, Smart Presets, `StyleBuilder` chainable, badges |
|
|
61
|
+
| [CLI](docs/cli.md) | 8 comandos `/help`/`/config`/`/themes`/... vía `logger.cli()` |
|
|
62
|
+
| [Playground](docs/playground.md) | Renderers raw y `Logger` wrappers para terminales |
|
|
63
|
+
| [Core Logger](docs/core.md) | `CoreLogger` minimal (~360 líneas) para Node/CLI ligeros |
|
|
64
|
+
| [Node (reserved)](docs/node.md) | Subpath reservado para futuras features Node-only |
|
|
65
|
+
| [Migración 0.18.x](docs/migration-v0.18.md) | Breaking changes desde 1.x–5.x |
|
|
66
|
+
| [API Reference](docs/api/) | TypeDoc generado, 164 archivos |
|
|
67
|
+
|
|
68
68
|
## 📊 Niveles de log
|
|
69
69
|
|
|
70
70
|
```text
|
|
71
71
|
trace(-1) < debug(0) < info(1) < warn(2) < error(3) < critical(4)
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
-
`
|
|
74
|
+
`success()` emite a nivel `info` con `tag: 'success'` para que transports distingan success de info genérico.
|
|
75
75
|
|
|
76
76
|
```typescript
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
logger.setVerbosity('debug'); // muestra trace + debug + ...
|
|
77
|
+
logger.setVerbosity('debug'); // trace + debug + info + ...
|
|
80
78
|
logger.setVerbosity('warn'); // solo warn, error, critical
|
|
81
79
|
logger.setVerbosity('silent'); // nada
|
|
82
80
|
```
|
|
83
81
|
|
|
84
|
-
`success()` emite a **INFO severity** (con styling de success y `tag: 'success'` en el record, para que transports distingan success de info genérico).
|
|
85
|
-
|
|
86
|
-
## 🧩 Log Context (MDC)
|
|
87
|
-
|
|
88
|
-
Contexto estructurado que se adjunta a **cada** log emitido y se mergea en `TransportRecord.attributes`:
|
|
89
|
-
|
|
90
|
-
```typescript
|
|
91
|
-
// Mutar el logger (chaining)
|
|
92
|
-
logger.withContext({ requestId: 'req_123', userId: 'u_42' });
|
|
93
|
-
logger.info('processing'); // → attributes: { requestId, userId }
|
|
94
|
-
|
|
95
|
-
// Limpiar
|
|
96
|
-
logger.clearContext();
|
|
97
|
-
|
|
98
|
-
// Snapshot read-only
|
|
99
|
-
const ctx = logger.getContext();
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### Loggers hijuelos (inmutables)
|
|
103
|
-
|
|
104
|
-
`child()` devuelve un logger nuevo con contexto merged, **sin tocar al padre** — ideal para request-scoped logging:
|
|
105
|
-
|
|
106
|
-
```typescript
|
|
107
|
-
const requestLogger = logger.child({ requestId: getRequestId() });
|
|
108
|
-
requestLogger.info('auth ok'); // lleva requestId
|
|
109
|
-
logger.info('unrelated'); // NO lleva requestId (padre intacto)
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### Resource OTel
|
|
113
|
-
|
|
114
|
-
```typescript
|
|
115
|
-
logger.setResource({
|
|
116
|
-
'service.name': 'my-app',
|
|
117
|
-
'service.version': '1.2.3',
|
|
118
|
-
'deployment.environment': 'production'
|
|
119
|
-
});
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
## 📡 Transports
|
|
123
|
-
|
|
124
|
-
Los transports reciben cada `TransportRecord` y lo mandan a un destino. Se registran con `addTransport()`:
|
|
125
|
-
|
|
126
|
-
```typescript
|
|
127
|
-
import logger, { FileTransport, HttpTransport, OtlpTransport } from '@mks2508/better-logger';
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
### File (Node.js)
|
|
131
|
-
|
|
132
|
-
```typescript
|
|
133
|
-
logger.addTransport({
|
|
134
|
-
target: new FileTransport({
|
|
135
|
-
destination: '/var/log/app.log',
|
|
136
|
-
batchSize: 100,
|
|
137
|
-
flushInterval: 5000,
|
|
138
|
-
maxBufferSize: 10_000 // hard cap, drop oldest on overflow
|
|
139
|
-
}),
|
|
140
|
-
level: 'info'
|
|
141
|
-
});
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
- Escritura **async** con `fs.promises` (no bloquea el event loop)
|
|
145
|
-
- **Bounded buffer** — si se llena, dropea el record más viejo (avisa vía `onError`)
|
|
146
|
-
- Sanitización de `destination` (sin path traversal)
|
|
147
|
-
- En **browser**: fallback silencioso a `localStorage`
|
|
148
|
-
|
|
149
|
-
### HTTP
|
|
150
|
-
|
|
151
|
-
```typescript
|
|
152
|
-
logger.addTransport({
|
|
153
|
-
target: new HttpTransport({
|
|
154
|
-
url: 'https://logs.example.com/ingest',
|
|
155
|
-
batchSize: 50,
|
|
156
|
-
flushInterval: 5000,
|
|
157
|
-
maxBufferSize: 10_000,
|
|
158
|
-
maxRetries: 3,
|
|
159
|
-
headers: { 'Authorization': `Bearer ${process.env.LOG_TOKEN}` }
|
|
160
|
-
}),
|
|
161
|
-
level: 'warn'
|
|
162
|
-
});
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
- Batching + flush periódico
|
|
166
|
-
- **Retry con backoff exponencial** (bounded)
|
|
167
|
-
- **Status check** — solo re-bufferea en errores recuperables (5xx, red), descarta en 4xx
|
|
168
|
-
- Bounded buffer (sin OOM en outages largos)
|
|
169
|
-
|
|
170
|
-
### OTLP → SigNoz (o cualquier backend OTLP/HTTP)
|
|
171
|
-
|
|
172
|
-
```typescript
|
|
173
|
-
logger.addTransport({
|
|
174
|
-
target: new OtlpTransport({
|
|
175
|
-
endpoint: 'https://otelcollector.example.com:4318',
|
|
176
|
-
serviceName: 'my-app', // requerido (service.name)
|
|
177
|
-
serviceVersion: '1.2.3',
|
|
178
|
-
environment: 'production',
|
|
179
|
-
ingestKeyEnvVar: 'SIGNOZ_KEY', // lee process.env.SIGNOZ_KEY — NUNCA hardcodear
|
|
180
|
-
batchSize: 50,
|
|
181
|
-
flushInterval: 5000
|
|
182
|
-
})
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
logger.info('Hola desde better-logger → SigNoz');
|
|
186
|
-
// → POST <endpoint>/v1/logs con payload OTLP/HTTP JSON
|
|
187
|
-
// → visible en SigNoz Logs UI
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
El transport POSTea a `<endpoint>/v1/logs` con el body `LogsData` spec-compliant (`resourceLogs` → `scopeLogs` → `logRecords`). La ingestion key se lee de la **env var** indicada en `ingestKeyEnvVar` al construir el transport — no se escribe en código ni en el record.
|
|
191
|
-
|
|
192
|
-
> 🔐 **Seguridad:** la key vive en tu gestor de secrets (Bitwarden / Coolify env) y se inyecta vía `process.env`. El transport no la loguea ni la serializa.
|
|
193
|
-
|
|
194
|
-
### Registry de strings
|
|
195
|
-
|
|
196
|
-
Para los 4 built-ins puedes usar el nombre en vez de la instancia:
|
|
197
|
-
|
|
198
|
-
```typescript
|
|
199
|
-
logger.addTransport({ target: 'file', options: { destination: '/var/log/app.log' } });
|
|
200
|
-
logger.addTransport({ target: 'console' });
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
Para Otlp conviene la **instancia directa** (opciones tipadas: `endpoint`, `serviceName`, `ingestKeyEnvVar`).
|
|
204
|
-
|
|
205
|
-
### Custom transport
|
|
206
|
-
|
|
207
|
-
```typescript
|
|
208
|
-
import type { ITransport, TransportRecord } from '@mks2508/better-logger';
|
|
209
|
-
|
|
210
|
-
const elastic: ITransport = {
|
|
211
|
-
name: 'elasticsearch',
|
|
212
|
-
async write(record: TransportRecord) {
|
|
213
|
-
await fetch('https://es.example.com/logs/_doc', {
|
|
214
|
-
method: 'POST',
|
|
215
|
-
headers: { 'content-type': 'application/json' },
|
|
216
|
-
body: JSON.stringify(record)
|
|
217
|
-
});
|
|
218
|
-
},
|
|
219
|
-
async flush() { /* ... */ },
|
|
220
|
-
async close() { /* ... */ }
|
|
221
|
-
};
|
|
222
|
-
|
|
223
|
-
logger.addTransport({ target: elastic });
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
### Flush y shutdown
|
|
227
|
-
|
|
228
|
-
```typescript
|
|
229
|
-
await logger.flushTransports(); // fuerza el envío del buffer
|
|
230
|
-
await logger.closeTransports(); // cierra todos (drain)
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
En shutdown limpio: `await logger.cleanup()` hace drain de transports + reset de estado.
|
|
234
|
-
|
|
235
|
-
## 🪝 Hooks & Middleware
|
|
236
|
-
|
|
237
|
-
```typescript
|
|
238
|
-
// beforeLog es AWAITED — las mutaciones se reflejan en el mensaje emitido
|
|
239
|
-
logger.on('beforeLog', (entry) => {
|
|
240
|
-
entry.message = entry.message.replace(/password=\S+/g, 'password=***');
|
|
241
|
-
return entry;
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
// afterLog es fire-and-forget (no cambia el mensaje ya en pantalla)
|
|
245
|
-
logger.on('afterLog', (entry) => {
|
|
246
|
-
metrics.increment(`logs.${entry.level}`);
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
// Correlation ID en cada log
|
|
250
|
-
logger.use((entry, next) => {
|
|
251
|
-
entry.correlationId = getCorrelationId();
|
|
252
|
-
next();
|
|
253
|
-
});
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
`on()` / `once()` / `off()` / `use()` devuelven una función de unsub.
|
|
257
|
-
|
|
258
|
-
## 🧬 Serializers
|
|
259
|
-
|
|
260
|
-
Transforma tipos antes de serializarlos al log:
|
|
261
|
-
|
|
262
|
-
```typescript
|
|
263
|
-
logger.addSerializer(Error, (err) => ({
|
|
264
|
-
name: err.name,
|
|
265
|
-
message: err.message,
|
|
266
|
-
stack: err.stack?.split('\n').slice(0, 5)
|
|
267
|
-
}));
|
|
268
|
-
|
|
269
|
-
logger.addSerializer(User, (user) => ({
|
|
270
|
-
id: user.id,
|
|
271
|
-
email: user.email // password omitido
|
|
272
|
-
}));
|
|
273
|
-
|
|
274
|
-
logger.error('Failed:', new Error('timeout')); // Error serializado custom
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
## 🏷️ Scoped Loggers
|
|
278
|
-
|
|
279
|
-
```typescript
|
|
280
|
-
// Scope simple
|
|
281
|
-
const auth = logger.scope('Auth');
|
|
282
|
-
auth.info('validating token');
|
|
283
|
-
|
|
284
|
-
// Component (auto-badge COMPONENT)
|
|
285
|
-
const db = logger.component('Database');
|
|
286
|
-
db.lifecycle('connect', 'pool ready');
|
|
287
|
-
|
|
288
|
-
// API (auto-badge API, +métodos slow/rateLimit/auth/deprecated)
|
|
289
|
-
const api = logger.api('GraphQL');
|
|
290
|
-
api.slow('query timeout', 1200);
|
|
291
|
-
api.deprecated('use v2 endpoint');
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
### Context logger (bloques anidados)
|
|
295
|
-
|
|
296
|
-
```typescript
|
|
297
|
-
const request = logger.scope('Request');
|
|
298
|
-
|
|
299
|
-
await request.context('auth').runAsync(async () => {
|
|
300
|
-
// prefix efectivo: "Request:auth"
|
|
301
|
-
request.info('checking credentials');
|
|
302
|
-
await request.context('db').runAsync(async () => {
|
|
303
|
-
// prefix: "Request:auth:db"
|
|
304
|
-
request.info('querying user');
|
|
305
|
-
});
|
|
306
|
-
});
|
|
307
|
-
```
|
|
308
|
-
|
|
309
|
-
## 🎨 Styling
|
|
310
|
-
|
|
311
|
-
```typescript
|
|
312
|
-
// Presets
|
|
313
|
-
logger.preset('cyberpunk'); // neón, glow
|
|
314
|
-
logger.preset('glassmorphism'); // blur moderno
|
|
315
|
-
logger.preset('minimal');
|
|
316
|
-
logger.preset('debug');
|
|
317
|
-
|
|
318
|
-
// Toggles
|
|
319
|
-
logger.hideTimestamp().showLocation().hideBadges();
|
|
320
|
-
|
|
321
|
-
// Tema
|
|
322
|
-
logger.setTheme('dark'); // 'default' | 'dark' | 'light' | 'neon' | 'minimal' | 'cyberpunk'
|
|
323
|
-
```
|
|
324
|
-
|
|
325
|
-
### Estilos custom (StyleBuilder)
|
|
326
|
-
|
|
327
|
-
```typescript
|
|
328
|
-
import { createStyle } from '@mks2508/better-logger';
|
|
329
|
-
|
|
330
|
-
const style = createStyle()
|
|
331
|
-
.bg('linear-gradient(45deg, #667eea, #764ba2)')
|
|
332
|
-
.color('white')
|
|
333
|
-
.padding('12px 24px')
|
|
334
|
-
.rounded('8px')
|
|
335
|
-
.shadow('0 4px 15px rgba(102, 126, 234, 0.4)')
|
|
336
|
-
.build();
|
|
337
|
-
|
|
338
|
-
console.log('%c🚀 Hello', style);
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
## 🖥️ CLI Primitives
|
|
342
|
-
|
|
343
|
-
Spinners, boxes, tablas, steps y headers para CLIs Node.js:
|
|
344
|
-
|
|
345
|
-
```typescript
|
|
346
|
-
logger.header('Deploy', 'production');
|
|
347
|
-
logger.step(2, 5, 'building');
|
|
348
|
-
logger.spinner('uploading...');
|
|
349
|
-
|
|
350
|
-
logger.box('Build complete', { border: 'round' });
|
|
351
|
-
logger.cliTable([
|
|
352
|
-
{ service: 'api', status: 'ok' },
|
|
353
|
-
{ service: 'db', status: 'ok' }
|
|
354
|
-
]);
|
|
355
|
-
```
|
|
356
|
-
|
|
357
|
-
## 🔧 Configuración avanzada
|
|
358
|
-
|
|
359
|
-
```typescript
|
|
360
|
-
import { Logger } from '@mks2508/better-logger';
|
|
361
|
-
|
|
362
|
-
const logger = new Logger({
|
|
363
|
-
prefix: 'APP',
|
|
364
|
-
verbosity: 'debug',
|
|
365
|
-
enableStackTrace: true,
|
|
366
|
-
theme: 'dark',
|
|
367
|
-
timestampFormat: 'iso'
|
|
368
|
-
});
|
|
369
|
-
|
|
370
|
-
logger.updateConfig({ verbosity: 'warn' });
|
|
371
|
-
logger.resetConfig();
|
|
372
|
-
```
|
|
373
|
-
|
|
374
82
|
## 🌐 Compatibilidad
|
|
375
83
|
|
|
376
|
-
- ✅ **Browsers modernos** — soporte completo (CSS, DevTools, localStorage fallback)
|
|
84
|
+
- ✅ **Browsers modernos** — soporte completo (CSS, DevTools, `localStorage` fallback)
|
|
377
85
|
- ✅ **Node.js** — core + transports (File async, HTTP, OTLP)
|
|
378
|
-
- ✅ **TypeScript** — definiciones completas
|
|
379
|
-
- ✅ **ESM & CommonJS** — ambos exports
|
|
380
|
-
|
|
381
|
-
## 🔗 Recursos
|
|
382
|
-
|
|
383
|
-
- 📦 **[NPM](https://www.npmjs.com/package/@mks2508/better-logger)**
|
|
384
|
-
- 📚 **[Documentación](docs/)** — [API](docs/API.md) · [Core](docs/CORE.md) · [Exports](docs/EXPORTS.md) · [Styling](docs/STYLING.md)
|
|
385
|
-
- 🐛 **[Issues](https://github.com/MKS2508/advanced-logger/issues)**
|
|
86
|
+
- ✅ **TypeScript** — definiciones completas, cero `any` en superficie pública
|
|
87
|
+
- ✅ **ESM & CommonJS** — ambos exports; subpath layout (`./transports`, `./context`, `./hooks`, `./serializers`, `./styles`, `./cli`, `./playground`, `./core`)
|
|
386
88
|
|
|
387
89
|
## 📄 Licencia
|
|
388
90
|
|
|
389
|
-
MIT — ver [LICENSE](LICENSE).
|
|
91
|
+
MIT — ver [LICENSE](LICENSE).
|