@jmlq/logger 0.1.0-alpha.20 → 0.1.0-alpha.21
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 +472 -80
- package/architecture.md +112 -90
- package/assets/mongo-log.png +0 -0
- package/assets/pg-log.png +0 -0
- package/dist/application/factory/logger.factory.d.ts +2 -1
- package/dist/application/types/index.d.ts +1 -0
- package/dist/application/types/index.js +17 -0
- package/dist/{domain/ports/logger-factory-config.port.d.ts → application/types/logger-factory-config.type.d.ts} +3 -3
- package/dist/domain/ports/index.d.ts +0 -1
- package/dist/domain/ports/index.js +0 -2
- package/dist/index.d.ts +2 -1
- package/package.json +2 -2
- package/install.md +0 -632
- /package/dist/{domain/ports/logger-factory-config.port.js → application/types/logger-factory-config.type.js} +0 -0
package/architecture.md
CHANGED
|
@@ -2,69 +2,95 @@
|
|
|
2
2
|
|
|
3
3
|
## Visión General
|
|
4
4
|
|
|
5
|
-
El paquete `@jmlq/logger`
|
|
5
|
+
El paquete `@jmlq/logger` implementa **Clean Architecture** (Arquitectura Limpia), proporcionando un sistema de logging modular que permite registrar logs en múltiples destinos y enmascarar datos sensibles (PII).
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
### Principios Aplicados
|
|
8
8
|
|
|
9
|
-
- **Separación de responsabilidades**: Cada capa tiene una
|
|
10
|
-
- **Inversión de dependencias**: Las capas internas no
|
|
11
|
-
- **Extensibilidad**: Sistema de plugins para diferentes adaptadores
|
|
12
|
-
- **Testabilidad**:
|
|
13
|
-
|
|
9
|
+
- **Separación de responsabilidades**: Cada capa tiene una función específica
|
|
10
|
+
- **Inversión de dependencias**: Las capas internas no conocen las externas
|
|
11
|
+
- **Extensibilidad**: Sistema de plugins para diferentes adaptadores
|
|
12
|
+
- **Testabilidad**: Contratos claros facilitan las pruebas
|
|
13
|
+
|
|
14
|
+
---
|
|
14
15
|
|
|
15
16
|
## Estructura de Capas
|
|
16
17
|
|
|
17
18
|
### 📁 Domain (Capa de Dominio)
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
_La capa más interna - lógica de negocio pura_
|
|
21
|
+
|
|
22
|
+
#### **Value Objects**
|
|
23
|
+
|
|
24
|
+
- [`log-level.vo.ts`](src/domain/value-objects/log-level.vo.ts): Enumeración de niveles de logging (TRACE, DEBUG, INFO, WARN, ERROR, FATAL)
|
|
20
25
|
|
|
21
|
-
#### **
|
|
26
|
+
#### **Models**
|
|
22
27
|
|
|
23
|
-
- [`
|
|
28
|
+
- [`log-entry.model.ts`](src/domain/model/log-entry.model.ts): Estructura de datos de un log
|
|
29
|
+
- [`pii-options.model.ts`](src/domain/model/pii-options.model.ts): Configuración para enmascarado PII
|
|
30
|
+
- [`pii-replacement-rule.ts`](src/domain/model/pii-replacement-rule.ts): Reglas de reemplazo para datos sensibles
|
|
24
31
|
|
|
25
|
-
#### **Ports (
|
|
32
|
+
#### **Ports (Contratos)**
|
|
26
33
|
|
|
27
|
-
- [`
|
|
28
|
-
- [`
|
|
29
|
-
- [`
|
|
30
|
-
- [`
|
|
31
|
-
- [`ILoggerFactoryConfigPort`](src/domain/ports/logger-factory-config.port.ts): Contrato de configuración del factory
|
|
34
|
+
- [`logger.port.ts`](src/domain/ports/logger.port.ts): Interfaz principal del logger (`ILogger`)
|
|
35
|
+
- [`log-datasource.port.ts`](src/domain/ports/log-datasource.port.ts): Contrato para persistencia (`ILogDatasource`)
|
|
36
|
+
- [`pii-redactor.port.ts`](src/domain/ports/pii-redactor.port.ts): Contrato para enmascarado (`IPiiRedactor`)
|
|
37
|
+
- [`create-logger-options.port.ts`](src/domain/ports/create-logger-options.port.ts): Configuración del factory
|
|
32
38
|
|
|
33
39
|
#### **Services (Servicios de Dominio)**
|
|
34
40
|
|
|
35
|
-
- [`
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
41
|
+
- [`pii-redactor.service.ts`](src/domain/services/pii-redactor.service.ts): Implementación del enmascarado de datos sensibles
|
|
42
|
+
|
|
43
|
+
#### **Request/Response**
|
|
44
|
+
|
|
45
|
+
- [`log-filter.request.ts`](src/domain/request/log-filter.request.ts): Filtros para consultas (`LogFilterRequest`)
|
|
46
|
+
- [`log.response.ts`](src/domain/response/log.response.ts): Formato de respuesta (`ILogResponse`)
|
|
39
47
|
|
|
40
|
-
#### **Types &
|
|
48
|
+
#### **Types & Utils**
|
|
41
49
|
|
|
42
|
-
-
|
|
43
|
-
-
|
|
44
|
-
-
|
|
50
|
+
- [`log-message.type.ts`](src/domain/types/log-message.type.ts): Tipo para mensajes de log
|
|
51
|
+
- [`normalize-message.util.ts`](src/domain/utils/normalize-message.util.ts): Normalización de mensajes
|
|
52
|
+
- [`parse-log-level.util.ts`](src/domain/utils/parse-log-level.util.ts): Conversión de strings a LogLevel
|
|
53
|
+
- [`pii-regex.util.ts`](src/domain/utils/pii-regex.util.ts): Generación de expresiones regulares para PII
|
|
54
|
+
|
|
55
|
+
---
|
|
45
56
|
|
|
46
57
|
### 📁 Application (Capa de Aplicación)
|
|
47
58
|
|
|
48
|
-
|
|
59
|
+
_Orquesta casos de uso y coordina la lógica de negocio_
|
|
60
|
+
|
|
61
|
+
#### **Factory**
|
|
62
|
+
|
|
63
|
+
- [`logger.factory.ts`](src/application/factory/logger.factory.ts): **Punto de entrada principal** - crea instancias del logger con configuración completa
|
|
49
64
|
|
|
50
65
|
#### **Use Cases**
|
|
51
66
|
|
|
52
|
-
- [`
|
|
53
|
-
- [`
|
|
54
|
-
- [`
|
|
67
|
+
- [`save-log.use-case.ts`](src/application/use-cases/save-log.use-case.ts): Guarda logs aplicando filtros y PII
|
|
68
|
+
- [`get-logs.use-case.ts`](src/application/use-cases/get-logs.use-case.ts): Recupera logs con filtros avanzados
|
|
69
|
+
- [`flush-buffers.use-case.ts`](src/application/use-cases/flush-buffers.use-case.ts): Vacía buffers de los datasources
|
|
55
70
|
|
|
56
|
-
#### **
|
|
71
|
+
#### **Dependencies**
|
|
57
72
|
|
|
58
|
-
- [`
|
|
73
|
+
- [`save-log.props.ts`](src/application/use-cases/save-log/save-log.props.ts): Dependencias para SaveLogUseCase
|
|
74
|
+
|
|
75
|
+
#### **Types**
|
|
76
|
+
|
|
77
|
+
- [`logger-factory-config.type.ts`](src/application/types/logger-factory-config.type.ts): Configuración del factory (`ILoggerFactoryConfig`)
|
|
78
|
+
|
|
79
|
+
---
|
|
59
80
|
|
|
60
81
|
### 📁 Infrastructure (Capa de Infraestructura)
|
|
61
82
|
|
|
62
|
-
|
|
83
|
+
_Implementaciones concretas y adaptadores externos_
|
|
63
84
|
|
|
64
85
|
#### **Services**
|
|
65
86
|
|
|
66
|
-
- [`
|
|
67
|
-
|
|
87
|
+
- [`datasource.service.ts`](src/infrastructure/services/datasource.service.ts): Implementación del patrón Composite para múltiples datasources
|
|
88
|
+
|
|
89
|
+
#### **Types**
|
|
90
|
+
|
|
91
|
+
- [`on-data-source-error.type.ts`](src/infrastructure/types/on-data-source-error.type.ts): Manejo de errores de datasources
|
|
92
|
+
|
|
93
|
+
---
|
|
68
94
|
|
|
69
95
|
## Flujo de Dependencias
|
|
70
96
|
|
|
@@ -72,100 +98,96 @@ Implementaciones concretas de los contratos definidos en el dominio.
|
|
|
72
98
|
Infrastructure → Application → Domain
|
|
73
99
|
```
|
|
74
100
|
|
|
75
|
-
- **Domain**:
|
|
76
|
-
- **Application**:
|
|
77
|
-
- **Infrastructure**:
|
|
101
|
+
- **Domain**: Contiene la lógica pura, sin dependencias externas
|
|
102
|
+
- **Application**: Usa el Domain, coordina casos de uso
|
|
103
|
+
- **Infrastructure**: Implementa contratos del Domain
|
|
104
|
+
|
|
105
|
+
---
|
|
78
106
|
|
|
79
107
|
## Patrones Implementados
|
|
80
108
|
|
|
81
109
|
### **Factory Pattern**
|
|
82
110
|
|
|
83
|
-
|
|
111
|
+
[`logger.factory.ts`](src/application/factory/logger.factory.ts) centraliza la creación del logger y sus dependencias.
|
|
84
112
|
|
|
85
113
|
### **Port-Adapter Pattern**
|
|
86
114
|
|
|
87
|
-
Los ports en
|
|
115
|
+
Los ports en Domain definen contratos implementados por adaptadores externos (plugins).
|
|
88
116
|
|
|
89
117
|
### **Use Case Pattern**
|
|
90
118
|
|
|
91
|
-
Cada operación principal
|
|
119
|
+
Cada operación principal tiene un caso de uso con método `execute()`.
|
|
92
120
|
|
|
93
|
-
### **
|
|
121
|
+
### **Composite Pattern**
|
|
94
122
|
|
|
95
|
-
|
|
123
|
+
[`datasource.service.ts`](src/infrastructure/services/datasource.service.ts) maneja múltiples datasources como uno solo.
|
|
96
124
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
El logger soporta múltiples adaptadores de persistencia:
|
|
100
|
-
|
|
101
|
-
- **Filesystem**: `@jmlq/logger-plugin-fs`
|
|
102
|
-
- **MongoDB**: `@jmlq/logger-plugin-mongo`
|
|
103
|
-
- **PostgreSQL**: `@jmlq/logger-plugin-postgresql`
|
|
104
|
-
|
|
105
|
-
Cada plugin implementa los ports definidos en el domain.
|
|
125
|
+
---
|
|
106
126
|
|
|
107
127
|
## Características Principales
|
|
108
128
|
|
|
109
|
-
### **PII (Personally Identifiable Information)**
|
|
110
|
-
|
|
111
|
-
- Enmascarado automático de datos sensibles
|
|
112
|
-
- Patrones configurables y extensibles
|
|
113
|
-
- Soporte para patrones por defecto y personalizados
|
|
114
|
-
|
|
115
129
|
### **Niveles de Log**
|
|
116
130
|
|
|
117
|
-
-
|
|
131
|
+
- `TRACE` (10), `DEBUG` (20), `INFO` (30), `WARN` (40), `ERROR` (50), `FATAL` (60)
|
|
118
132
|
- Configuración de nivel mínimo por entorno
|
|
119
133
|
|
|
134
|
+
### **Enmascarado PII**
|
|
135
|
+
|
|
136
|
+
- Patrones configurables para emails, tarjetas, teléfonos, etc.
|
|
137
|
+
- Procesamiento profundo en objetos anidados
|
|
138
|
+
- Whitelist/blacklist de campos
|
|
139
|
+
|
|
120
140
|
### **Múltiples Datasources**
|
|
121
141
|
|
|
122
|
-
- Soporte simultáneo para
|
|
123
|
-
-
|
|
142
|
+
- Soporte simultáneo para archivos, MongoDB, PostgreSQL
|
|
143
|
+
- Fan-out automático a todos los datasources configurados
|
|
144
|
+
|
|
145
|
+
### **Sistema de Plugins**
|
|
124
146
|
|
|
125
|
-
|
|
147
|
+
- **Filesystem**: `@jmlq/logger-plugin-fs`
|
|
148
|
+
- **MongoDB**: `@jmlq/logger-plugin-mongo`
|
|
149
|
+
- **PostgreSQL**: `@jmlq/logger-plugin-postgresql`
|
|
126
150
|
|
|
127
|
-
|
|
128
|
-
- Configuración programática
|
|
129
|
-
- Políticas de retención de datos
|
|
151
|
+
---
|
|
130
152
|
|
|
131
|
-
##
|
|
153
|
+
## Punto de Entrada
|
|
132
154
|
|
|
133
155
|
```typescript
|
|
134
|
-
import {
|
|
156
|
+
import { createLogger } from "@jmlq/logger";
|
|
135
157
|
|
|
136
|
-
const logger =
|
|
137
|
-
|
|
138
|
-
|
|
158
|
+
const logger = createLogger({
|
|
159
|
+
datasources: [fsAdapter, mongoAdapter],
|
|
160
|
+
minLevel: LogLevel.INFO,
|
|
161
|
+
redactorOptions: {
|
|
139
162
|
enabled: true,
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
adapters: {
|
|
144
|
-
fs: { basePath: "./logs" },
|
|
145
|
-
mongo: { url: "mongodb://localhost:27017", dbName: "logs" },
|
|
163
|
+
patterns: [
|
|
164
|
+
/* reglas PII */
|
|
165
|
+
],
|
|
146
166
|
},
|
|
147
167
|
});
|
|
148
168
|
|
|
149
|
-
await logger.info("User logged in", {
|
|
150
|
-
userId: "12345",
|
|
151
|
-
email: "user@example.com",
|
|
152
|
-
});
|
|
169
|
+
await logger.info("User logged in", { userId: "123" });
|
|
153
170
|
```
|
|
154
171
|
|
|
155
|
-
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Flujo de Datos
|
|
156
175
|
|
|
157
|
-
|
|
176
|
+
1. **Cliente** → llama método del logger (`info`, `error`, etc.)
|
|
177
|
+
2. **Factory** → crea logger con casos de uso configurados
|
|
178
|
+
3. **SaveLogUseCase** → aplica filtros de nivel y PII
|
|
179
|
+
4. **DataSourceService** → distribuye a múltiples datasources
|
|
180
|
+
5. **Plugins** → persisten en destino final (archivo, BD, etc.)
|
|
158
181
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
> - Mocks sencillos de implementar
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Testing
|
|
163
185
|
|
|
164
|
-
|
|
186
|
+
La arquitectura facilita testing mediante:
|
|
165
187
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
188
|
+
- Interfaces bien definidas para mocking
|
|
189
|
+
- Casos de uso aislados
|
|
190
|
+
- Servicios desacoplados
|
|
191
|
+
- Inyección de dependencias explícita
|
|
170
192
|
|
|
171
|
-
Esta arquitectura asegura mantenibilidad
|
|
193
|
+
Esta arquitectura asegura **mantenibilidad**, **extensibilidad** y **testabilidad** siguiendo principios SOLID y Clean Architecture.
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./logger-factory-config.type";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./logger-factory-config.type"), exports);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ILogDatasource, IPiiRedactor } from "
|
|
2
|
-
import { PiiOptions } from "
|
|
3
|
-
import { LogLevel } from "
|
|
1
|
+
import { ILogDatasource, IPiiRedactor } from "../../domain/ports";
|
|
2
|
+
import { PiiOptions } from "../../domain/model";
|
|
3
|
+
import { LogLevel } from "../../domain/value-objects";
|
|
4
4
|
/**
|
|
5
5
|
* Configuración de alto nivel para construir el logger.
|
|
6
6
|
* Es lo que recibe el usuario del paquete npm.
|
|
@@ -18,5 +18,3 @@ __exportStar(require("./log-datasource.port"), exports);
|
|
|
18
18
|
__exportStar(require("./logger.port"), exports);
|
|
19
19
|
__exportStar(require("./pii-redactor.port"), exports);
|
|
20
20
|
__exportStar(require("./create-logger-options.port"), exports);
|
|
21
|
-
__exportStar(require("./logger-factory-config.port"), exports);
|
|
22
|
-
// export * from "./logger-service.port";
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { createLogger } from "./application/factory";
|
|
2
|
-
export type {
|
|
2
|
+
export type { ILoggerFactoryConfig } from "./application/types";
|
|
3
|
+
export type { ILogger, ILogDatasource } from "./domain/ports";
|
|
3
4
|
export { LogLevel } from "./domain/value-objects";
|
|
4
5
|
export type { LogFilterRequest as LogSearchRequest } from "./domain/request";
|
|
5
6
|
export type { ILogResponse as LogRecord } from "./domain/response";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jmlq/logger",
|
|
3
3
|
"description": "logger package with clean architecture",
|
|
4
|
-
"version": "0.1.0-alpha.
|
|
4
|
+
"version": "0.1.0-alpha.21",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
@@ -40,6 +40,6 @@
|
|
|
40
40
|
"dist",
|
|
41
41
|
"README.md",
|
|
42
42
|
"architecture.md",
|
|
43
|
-
"
|
|
43
|
+
"assets"
|
|
44
44
|
]
|
|
45
45
|
}
|