lognerd 0.1.0
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 +204 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/logger.config.d.ts +3 -0
- package/dist/logger/logger.config.d.ts.map +1 -0
- package/dist/logger/logger.config.js +166 -0
- package/dist/logger/logger.config.js.map +1 -0
- package/dist/logger/logger.service.d.ts +18 -0
- package/dist/logger/logger.service.d.ts.map +1 -0
- package/dist/logger/logger.service.js +146 -0
- package/dist/logger/logger.service.js.map +1 -0
- package/dist/logger/logger.types.d.ts +17 -0
- package/dist/logger/logger.types.d.ts.map +1 -0
- package/dist/logger/logger.types.js +3 -0
- package/dist/logger/logger.types.js.map +1 -0
- package/dist/logger/logger.utils.d.ts +5 -0
- package/dist/logger/logger.utils.d.ts.map +1 -0
- package/dist/logger/logger.utils.js +36 -0
- package/dist/logger/logger.utils.js.map +1 -0
- package/package.json +42 -0
package/README.md
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# lognerd
|
|
2
|
+
|
|
3
|
+
Sistema de logging con colores y escritura a archivo para Node.js. Desarrollado con TypeScript y diseñado para ser fácil de usar y configurar.
|
|
4
|
+
|
|
5
|
+
## 🚀 Instalación
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add lognerd
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
o con npm:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install lognerd
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 📖 Uso Básico
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { createLogger } from 'lognerd';
|
|
21
|
+
|
|
22
|
+
const logger = createLogger();
|
|
23
|
+
|
|
24
|
+
logger.info('Aplicación iniciada');
|
|
25
|
+
logger.error('Error crítico', { code: 500, message: 'Error de servidor' });
|
|
26
|
+
logger.warn('Advertencia: conexión lenta');
|
|
27
|
+
logger.debug('Información de debug', { userId: 123 });
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## ⚙️ Configuración
|
|
31
|
+
|
|
32
|
+
### Configuración mediante Variables de Entorno (Recomendado)
|
|
33
|
+
|
|
34
|
+
Puedes configurar lognerd completamente mediante variables de entorno. Esto es ideal para Vite, Next.js, y otros entornos.
|
|
35
|
+
|
|
36
|
+
**⚠️ Importante para Vite:** Vite solo expone variables que comienzan con `VITE_` al código del cliente. Para Vite, usa el prefijo `VITE_LOGNERD_*`.
|
|
37
|
+
|
|
38
|
+
**Variables de entorno disponibles:**
|
|
39
|
+
|
|
40
|
+
| Variable (Node.js/Next.js) | Variable (Vite) | Descripción | Valores | Por defecto |
|
|
41
|
+
|----------------------------|-----------------|-------------|---------|-------------|
|
|
42
|
+
| `LOGNERD_LEVEL` | `VITE_LOGNERD_LEVEL` | Nivel mínimo de log | `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
|
|
43
|
+
| `LOGNERD_ENVIRONMENT` | `VITE_LOGNERD_ENVIRONMENT` | Entorno de ejecución | `development`, `production` | `development` |
|
|
44
|
+
| `NODE_ENV` | `NODE_ENV` | También se puede usar (compatible) | `development`, `production` | - |
|
|
45
|
+
| `LOGNERD_ENABLE_CONSOLE` | `VITE_LOGNERD_ENABLE_CONSOLE` | Habilitar salida en consola | `true`, `false`, `1`, `0` | `true` |
|
|
46
|
+
| `LOGNERD_ENABLE_FILE` | `VITE_LOGNERD_ENABLE_FILE` | Habilitar escritura en archivo | `true`, `false`, `1`, `0` | `true` |
|
|
47
|
+
| `LOGNERD_FILE_PATH` | `VITE_LOGNERD_FILE_PATH` | Ruta del archivo de log | Ruta relativa o absoluta | `./logs/app.log` |
|
|
48
|
+
| `LOGNERD_MAX_FILE_SIZE` | `VITE_LOGNERD_MAX_FILE_SIZE` | Tamaño máximo del archivo en MB | Número entero | `10` |
|
|
49
|
+
| `LOGNERD_MAX_FILES` | `VITE_LOGNERD_MAX_FILES` | Número máximo de archivos rotados | Número entero | `5` |
|
|
50
|
+
|
|
51
|
+
**Ejemplo para Node.js/Next.js:**
|
|
52
|
+
```bash
|
|
53
|
+
# .env
|
|
54
|
+
LOGNERD_LEVEL=INFO
|
|
55
|
+
LOGNERD_ENVIRONMENT=development
|
|
56
|
+
LOGNERD_ENABLE_CONSOLE=true
|
|
57
|
+
LOGNERD_ENABLE_FILE=true
|
|
58
|
+
LOGNERD_FILE_PATH=./logs/app.log
|
|
59
|
+
LOGNERD_MAX_FILE_SIZE=10
|
|
60
|
+
LOGNERD_MAX_FILES=5
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Ejemplo para Vite:**
|
|
64
|
+
```bash
|
|
65
|
+
# .env
|
|
66
|
+
VITE_LOGNERD_LEVEL=INFO
|
|
67
|
+
VITE_LOGNERD_ENVIRONMENT=development
|
|
68
|
+
VITE_LOGNERD_ENABLE_CONSOLE=true
|
|
69
|
+
VITE_LOGNERD_ENABLE_FILE=true
|
|
70
|
+
VITE_LOGNERD_FILE_PATH=./logs/app.log
|
|
71
|
+
VITE_LOGNERD_MAX_FILE_SIZE=10
|
|
72
|
+
VITE_LOGNERD_MAX_FILES=5
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Ejemplo para producción (Vite):**
|
|
76
|
+
```bash
|
|
77
|
+
# .env.production
|
|
78
|
+
VITE_LOGNERD_LEVEL=WARN
|
|
79
|
+
VITE_LOGNERD_ENVIRONMENT=production
|
|
80
|
+
VITE_LOGNERD_FILE_PATH=./logs/production.log
|
|
81
|
+
VITE_LOGNERD_MAX_FILE_SIZE=50
|
|
82
|
+
VITE_LOGNERD_MAX_FILES=10
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Configuración mediante Código
|
|
86
|
+
|
|
87
|
+
También puedes configurar el logger mediante código TypeScript:
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
import { createLogger } from 'lognerd';
|
|
91
|
+
|
|
92
|
+
const logger = createLogger({
|
|
93
|
+
level: 'DEBUG', // Nivel mínimo de log: 'DEBUG' | 'INFO' | 'WARN' | 'ERROR'
|
|
94
|
+
environment: 'development', // 'development' | 'production'
|
|
95
|
+
enableConsole: true, // Habilitar salida en consola
|
|
96
|
+
enableFile: true, // Habilitar escritura en archivo
|
|
97
|
+
filePath: './logs/app.log', // Ruta del archivo de log
|
|
98
|
+
maxFileSize: 10, // Tamaño máximo del archivo en MB (default: 10)
|
|
99
|
+
maxFiles: 5, // Número máximo de archivos de log rotados (default: 5)
|
|
100
|
+
});
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Nota:** La configuración mediante código tiene prioridad sobre las variables de entorno. El orden de prioridad es: `código > variables de entorno > valores por defecto`.
|
|
104
|
+
|
|
105
|
+
### Configuración para Producción
|
|
106
|
+
|
|
107
|
+
En producción, la consola se deshabilita automáticamente pero los logs se siguen escribiendo en archivo:
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
const logger = createLogger({
|
|
111
|
+
environment: 'production', // Automáticamente deshabilita consola
|
|
112
|
+
level: 'WARN', // Solo logs de WARN y ERROR en producción
|
|
113
|
+
filePath: './logs/production.log',
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
O simplemente usando variables de entorno:
|
|
118
|
+
```bash
|
|
119
|
+
NODE_ENV=production LOGNERD_LEVEL=WARN
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## 🎨 Características
|
|
123
|
+
|
|
124
|
+
- ✅ **Niveles de log**: ERROR, WARN, INFO, DEBUG
|
|
125
|
+
- ✅ **Colores en consola** para desarrollo (rojo para ERROR, amarillo para WARN, cyan para INFO, magenta para DEBUG)
|
|
126
|
+
- ✅ **Escritura automática a archivo** (siempre activa, incluso en producción)
|
|
127
|
+
- ✅ **Deshabilitación automática de consola en producción**
|
|
128
|
+
- ✅ **Rotación automática de archivos** cuando alcanzan el tamaño máximo
|
|
129
|
+
- ✅ **Limpieza automática** de archivos antiguos
|
|
130
|
+
- ✅ **TypeScript** con tipos completos
|
|
131
|
+
- ✅ **Sin dependencias externas** (solo usa módulos nativos de Node.js)
|
|
132
|
+
|
|
133
|
+
## 📝 Ejemplos
|
|
134
|
+
|
|
135
|
+
### Ejemplo Completo
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
import { createLogger } from 'lognerd';
|
|
139
|
+
|
|
140
|
+
const logger = createLogger({
|
|
141
|
+
level: process.env.NODE_ENV === 'production' ? 'WARN' : 'DEBUG',
|
|
142
|
+
environment: process.env.NODE_ENV || 'development',
|
|
143
|
+
filePath: './logs/app.log',
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// En desarrollo: se muestra en consola con colores y se guarda en archivo
|
|
147
|
+
// En producción: solo se guarda en archivo
|
|
148
|
+
|
|
149
|
+
logger.info('Servidor iniciado en puerto 3000');
|
|
150
|
+
logger.debug('Variables de entorno cargadas', { env: process.env.NODE_ENV });
|
|
151
|
+
|
|
152
|
+
try {
|
|
153
|
+
// Tu código aquí
|
|
154
|
+
logger.info('Operación exitosa');
|
|
155
|
+
} catch (error) {
|
|
156
|
+
logger.error('Error en operación', { error: error.message, stack: error.stack });
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Actualizar Configuración en Tiempo de Ejecución
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
const logger = createLogger();
|
|
164
|
+
|
|
165
|
+
// Cambiar el nivel de log dinámicamente
|
|
166
|
+
logger.updateConfig({ level: 'ERROR' });
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## 🔧 API
|
|
170
|
+
|
|
171
|
+
### `createLogger(config?: Partial<LoggerConfig>): LoggerService`
|
|
172
|
+
|
|
173
|
+
Crea una instancia del logger con la configuración proporcionada.
|
|
174
|
+
|
|
175
|
+
### Métodos del Logger
|
|
176
|
+
|
|
177
|
+
- `logger.error(message: string, data?: unknown): void` - Log de error
|
|
178
|
+
- `logger.warn(message: string, data?: unknown): void` - Log de advertencia
|
|
179
|
+
- `logger.info(message: string, data?: unknown): void` - Log informativo
|
|
180
|
+
- `logger.debug(message: string, data?: unknown): void` - Log de debug
|
|
181
|
+
- `logger.updateConfig(newConfig: Partial<LoggerConfig>): void` - Actualizar configuración
|
|
182
|
+
|
|
183
|
+
## 📦 Estructura de Archivos de Log
|
|
184
|
+
|
|
185
|
+
Los logs se guardan en el formato:
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
2024-01-15T10:30:45.123Z [ERROR] Error crítico | Data: {"code":500}
|
|
189
|
+
2024-01-15T10:30:46.456Z [WARN] Advertencia | Data: {"timeout":5000}
|
|
190
|
+
2024-01-15T10:30:47.789Z [INFO] Operación completada
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## 🔄 Rotación de Archivos
|
|
194
|
+
|
|
195
|
+
Cuando un archivo de log alcanza el tamaño máximo configurado (`maxFileSize`), se renombra automáticamente con un timestamp y se crea un nuevo archivo. Los archivos antiguos se eliminan automáticamente cuando exceden el número máximo configurado (`maxFiles`).
|
|
196
|
+
|
|
197
|
+
## 📄 Licencia
|
|
198
|
+
|
|
199
|
+
MIT
|
|
200
|
+
|
|
201
|
+
## 👤 Autor
|
|
202
|
+
|
|
203
|
+
Sergio Olivo O
|
|
204
|
+
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { LoggerService } from './logger/logger.service';
|
|
2
|
+
import { createLoggerConfig } from './logger/logger.config';
|
|
3
|
+
import { LoggerConfig, LogLevel } from './logger/logger.types';
|
|
4
|
+
export declare const createLogger: (config?: Partial<LoggerConfig>) => LoggerService;
|
|
5
|
+
export { LoggerService };
|
|
6
|
+
export type { LoggerConfig, LogLevel };
|
|
7
|
+
export { createLoggerConfig };
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE/D,eAAO,MAAM,YAAY,GAAI,SAAS,OAAO,CAAC,YAAY,CAAC,kBAG1D,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createLoggerConfig = exports.LoggerService = exports.createLogger = void 0;
|
|
4
|
+
const logger_service_1 = require("./logger/logger.service");
|
|
5
|
+
Object.defineProperty(exports, "LoggerService", { enumerable: true, get: function () { return logger_service_1.LoggerService; } });
|
|
6
|
+
const logger_config_1 = require("./logger/logger.config");
|
|
7
|
+
Object.defineProperty(exports, "createLoggerConfig", { enumerable: true, get: function () { return logger_config_1.createLoggerConfig; } });
|
|
8
|
+
const createLogger = (config) => {
|
|
9
|
+
const loggerConfig = (0, logger_config_1.createLoggerConfig)(config);
|
|
10
|
+
return new logger_service_1.LoggerService(loggerConfig);
|
|
11
|
+
};
|
|
12
|
+
exports.createLogger = createLogger;
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,4DAAwD;AAS/C,8FATA,8BAAa,OASA;AARtB,0DAA4D;AAUnD,mGAVA,kCAAkB,OAUA;AAPpB,MAAM,YAAY,GAAG,CAAC,MAA8B,EAAE,EAAE;IAC7D,MAAM,YAAY,GAAG,IAAA,kCAAkB,EAAC,MAAM,CAAC,CAAC;IAChD,OAAO,IAAI,8BAAa,CAAC,YAAY,CAAC,CAAC;AACzC,CAAC,CAAC;AAHW,QAAA,YAAY,gBAGvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.config.d.ts","sourceRoot":"","sources":["../../src/logger/logger.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAY,MAAM,gBAAgB,CAAC;AAuHxD,eAAO,MAAM,kBAAkB,GAC7B,eAAe,OAAO,CAAC,YAAY,CAAC,KACnC,YA2BF,CAAC"}
|
|
@@ -0,0 +1,166 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.createLoggerConfig = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
/**
|
|
40
|
+
* Lee una variable de entorno y la convierte a boolean
|
|
41
|
+
* Soporta tanto LOGNERD_* como VITE_LOGNERD_*
|
|
42
|
+
*/
|
|
43
|
+
const getEnvBoolean = (key, defaultValue) => {
|
|
44
|
+
const value = getEnvValue(key);
|
|
45
|
+
if (value === undefined)
|
|
46
|
+
return defaultValue;
|
|
47
|
+
return value.toLowerCase() === 'true' || value === '1';
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Lee una variable de entorno y la convierte a number
|
|
51
|
+
* Soporta tanto LOGNERD_* como VITE_LOGNERD_*
|
|
52
|
+
*/
|
|
53
|
+
const getEnvNumber = (key, defaultValue) => {
|
|
54
|
+
const value = getEnvValue(key);
|
|
55
|
+
if (value === undefined)
|
|
56
|
+
return defaultValue;
|
|
57
|
+
const parsed = parseInt(value, 10);
|
|
58
|
+
return isNaN(parsed) ? defaultValue : parsed;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Lee una variable de entorno y valida que sea un LogLevel válido
|
|
62
|
+
* Soporta tanto LOGNERD_* como VITE_LOGNERD_*
|
|
63
|
+
*/
|
|
64
|
+
const getEnvLogLevel = (key, defaultValue) => {
|
|
65
|
+
const value = getEnvValue(key);
|
|
66
|
+
if (value === undefined)
|
|
67
|
+
return defaultValue;
|
|
68
|
+
const upperValue = value.toUpperCase();
|
|
69
|
+
if (['DEBUG', 'INFO', 'WARN', 'ERROR'].includes(upperValue)) {
|
|
70
|
+
return upperValue;
|
|
71
|
+
}
|
|
72
|
+
return defaultValue;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Lee una variable de entorno con soporte para prefijo VITE_
|
|
76
|
+
* Vite solo expone variables que comienzan con VITE_ al código del cliente
|
|
77
|
+
*/
|
|
78
|
+
const getEnvValue = (key) => {
|
|
79
|
+
// Primero intentar con prefijo VITE_ (para Vite)
|
|
80
|
+
const viteKey = `VITE_${key}`;
|
|
81
|
+
if (process.env[viteKey] !== undefined) {
|
|
82
|
+
return process.env[viteKey];
|
|
83
|
+
}
|
|
84
|
+
// Luego intentar sin prefijo (para Node.js y otros entornos)
|
|
85
|
+
return process.env[key];
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Lee la configuración desde variables de entorno
|
|
89
|
+
* Soporta tanto LOGNERD_* (Node.js) como VITE_LOGNERD_* (Vite)
|
|
90
|
+
*/
|
|
91
|
+
const getConfigFromEnv = () => {
|
|
92
|
+
const config = {};
|
|
93
|
+
// Nivel de log
|
|
94
|
+
const levelValue = getEnvValue('LOGNERD_LEVEL');
|
|
95
|
+
if (levelValue) {
|
|
96
|
+
config.level = getEnvLogLevel('LOGNERD_LEVEL', 'INFO');
|
|
97
|
+
}
|
|
98
|
+
// Entorno (compatible con NODE_ENV, LOGNERD_ENVIRONMENT y VITE_LOGNERD_ENVIRONMENT)
|
|
99
|
+
const environment = (getEnvValue('LOGNERD_ENVIRONMENT') ||
|
|
100
|
+
process.env.NODE_ENV ||
|
|
101
|
+
'development');
|
|
102
|
+
if (environment === 'development' || environment === 'production') {
|
|
103
|
+
config.environment = environment;
|
|
104
|
+
}
|
|
105
|
+
// Habilitar consola
|
|
106
|
+
const enableConsoleValue = getEnvValue('LOGNERD_ENABLE_CONSOLE');
|
|
107
|
+
if (enableConsoleValue !== undefined) {
|
|
108
|
+
config.enableConsole = getEnvBoolean('LOGNERD_ENABLE_CONSOLE', true);
|
|
109
|
+
}
|
|
110
|
+
// Habilitar archivo
|
|
111
|
+
const enableFileValue = getEnvValue('LOGNERD_ENABLE_FILE');
|
|
112
|
+
if (enableFileValue !== undefined) {
|
|
113
|
+
config.enableFile = getEnvBoolean('LOGNERD_ENABLE_FILE', true);
|
|
114
|
+
}
|
|
115
|
+
// Ruta del archivo
|
|
116
|
+
const filePathValue = getEnvValue('LOGNERD_FILE_PATH');
|
|
117
|
+
if (filePathValue) {
|
|
118
|
+
config.filePath = filePathValue;
|
|
119
|
+
}
|
|
120
|
+
// Tamaño máximo del archivo en MB
|
|
121
|
+
const maxFileSizeValue = getEnvValue('LOGNERD_MAX_FILE_SIZE');
|
|
122
|
+
if (maxFileSizeValue !== undefined) {
|
|
123
|
+
config.maxFileSize = getEnvNumber('LOGNERD_MAX_FILE_SIZE', 10);
|
|
124
|
+
}
|
|
125
|
+
// Número máximo de archivos
|
|
126
|
+
const maxFilesValue = getEnvValue('LOGNERD_MAX_FILES');
|
|
127
|
+
if (maxFilesValue !== undefined) {
|
|
128
|
+
config.maxFiles = getEnvNumber('LOGNERD_MAX_FILES', 5);
|
|
129
|
+
}
|
|
130
|
+
return config;
|
|
131
|
+
};
|
|
132
|
+
const defaultConfig = {
|
|
133
|
+
level: 'INFO',
|
|
134
|
+
enableConsole: true,
|
|
135
|
+
enableFile: true,
|
|
136
|
+
filePath: path.join(process.cwd(), 'logs', 'app.log'),
|
|
137
|
+
environment: 'development',
|
|
138
|
+
maxFileSize: 10, // 10MB
|
|
139
|
+
maxFiles: 5,
|
|
140
|
+
};
|
|
141
|
+
const createLoggerConfig = (customConfig) => {
|
|
142
|
+
// Primero leer desde variables de entorno
|
|
143
|
+
const envConfig = getConfigFromEnv();
|
|
144
|
+
// Combinar: defaults -> env -> customConfig (customConfig tiene prioridad)
|
|
145
|
+
const config = {
|
|
146
|
+
...defaultConfig,
|
|
147
|
+
...envConfig,
|
|
148
|
+
...customConfig,
|
|
149
|
+
};
|
|
150
|
+
// En producción, deshabilitar consola pero mantener archivo
|
|
151
|
+
// (solo si no se especificó explícitamente enableConsole)
|
|
152
|
+
if (config.environment === 'production' && customConfig?.enableConsole === undefined && envConfig.enableConsole === undefined) {
|
|
153
|
+
config.enableConsole = false;
|
|
154
|
+
config.enableFile = true;
|
|
155
|
+
}
|
|
156
|
+
// Asegurar que el directorio de logs existe
|
|
157
|
+
if (config.enableFile && config.filePath) {
|
|
158
|
+
const logDir = path.dirname(config.filePath);
|
|
159
|
+
if (!fs.existsSync(logDir)) {
|
|
160
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return config;
|
|
164
|
+
};
|
|
165
|
+
exports.createLoggerConfig = createLoggerConfig;
|
|
166
|
+
//# sourceMappingURL=logger.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.config.js","sourceRoot":"","sources":["../../src/logger/logger.config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,uCAAyB;AACzB,2CAA6B;AAE7B;;;GAGG;AACH,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,YAAqB,EAAW,EAAE;IACpE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC;IAC7C,OAAO,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG,CAAC;AACzD,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,YAAoB,EAAU,EAAE;IACjE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/C,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,YAAsB,EAAY,EAAE;IACvE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC;IAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,OAAO,UAAsB,CAAC;IAChC,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,GAAG,CAAC,GAAW,EAAsB,EAAE;IACtD,iDAAiD;IACjD,MAAM,OAAO,GAAG,QAAQ,GAAG,EAAE,CAAC;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,6DAA6D;IAC7D,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,gBAAgB,GAAG,GAA0B,EAAE;IACnD,MAAM,MAAM,GAA0B,EAAE,CAAC;IAEzC,eAAe;IACf,MAAM,UAAU,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC;IAChD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IAED,oFAAoF;IACpF,MAAM,WAAW,GAAG,CAClB,WAAW,CAAC,qBAAqB,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,QAAQ;QACpB,aAAa,CACkB,CAAC;IAClC,IAAI,WAAW,KAAK,aAAa,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;QAClE,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,CAAC;IAED,oBAAoB;IACpB,MAAM,kBAAkB,GAAG,WAAW,CAAC,wBAAwB,CAAC,CAAC;IACjE,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,CAAC,aAAa,GAAG,aAAa,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,oBAAoB;IACpB,MAAM,eAAe,GAAG,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAC3D,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,UAAU,GAAG,aAAa,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,mBAAmB;IACnB,MAAM,aAAa,GAAG,WAAW,CAAC,mBAAmB,CAAC,CAAC;IACvD,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,CAAC,QAAQ,GAAG,aAAa,CAAC;IAClC,CAAC;IAED,kCAAkC;IAClC,MAAM,gBAAgB,GAAG,WAAW,CAAC,uBAAuB,CAAC,CAAC;IAC9D,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,CAAC,WAAW,GAAG,YAAY,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,4BAA4B;IAC5B,MAAM,aAAa,GAAG,WAAW,CAAC,mBAAmB,CAAC,CAAC;IACvD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAiB;IAClC,KAAK,EAAE,MAAM;IACb,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC;IACrD,WAAW,EAAE,aAAa;IAC1B,WAAW,EAAE,EAAE,EAAE,OAAO;IACxB,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEK,MAAM,kBAAkB,GAAG,CAChC,YAAoC,EACtB,EAAE;IAChB,0CAA0C;IAC1C,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IAErC,2EAA2E;IAC3E,MAAM,MAAM,GAAiB;QAC3B,GAAG,aAAa;QAChB,GAAG,SAAS;QACZ,GAAG,YAAY;KAChB,CAAC;IAEF,4DAA4D;IAC5D,0DAA0D;IAC1D,IAAI,MAAM,CAAC,WAAW,KAAK,YAAY,IAAI,YAAY,EAAE,aAAa,KAAK,SAAS,IAAI,SAAS,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QAC9H,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC;QAC7B,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,4CAA4C;IAC5C,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AA7BW,QAAA,kBAAkB,sBA6B7B"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { LoggerConfig } from './logger.types';
|
|
2
|
+
declare class LoggerService {
|
|
3
|
+
private config;
|
|
4
|
+
private logLevels;
|
|
5
|
+
constructor(config: LoggerConfig);
|
|
6
|
+
private shouldLog;
|
|
7
|
+
private writeToFile;
|
|
8
|
+
private rotateLogFileIfNeeded;
|
|
9
|
+
private cleanOldLogFiles;
|
|
10
|
+
private log;
|
|
11
|
+
error(message: string, data?: unknown): void;
|
|
12
|
+
warn(message: string, data?: unknown): void;
|
|
13
|
+
info(message: string, data?: unknown): void;
|
|
14
|
+
debug(message: string, data?: unknown): void;
|
|
15
|
+
updateConfig(newConfig: Partial<LoggerConfig>): void;
|
|
16
|
+
}
|
|
17
|
+
export { LoggerService };
|
|
18
|
+
//# sourceMappingURL=logger.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.service.d.ts","sourceRoot":"","sources":["../../src/logger/logger.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAsB,MAAM,gBAAgB,CAAC;AAGlE,cAAM,aAAa;IACjB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,SAAS,CAAkD;gBAEvD,MAAM,EAAE,YAAY;IAIhC,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,qBAAqB;IA2B7B,OAAO,CAAC,gBAAgB;IA0BxB,OAAO,CAAC,GAAG;IAqBX,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI3C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI5C,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;CAGrD;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.LoggerService = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const logger_utils_1 = require("./logger.utils");
|
|
40
|
+
class LoggerService {
|
|
41
|
+
constructor(config) {
|
|
42
|
+
this.logLevels = ['DEBUG', 'INFO', 'WARN', 'ERROR'];
|
|
43
|
+
this.config = config;
|
|
44
|
+
}
|
|
45
|
+
shouldLog(level) {
|
|
46
|
+
const currentLevelIndex = this.logLevels.indexOf(this.config.level);
|
|
47
|
+
const messageLevelIndex = this.logLevels.indexOf(level);
|
|
48
|
+
return messageLevelIndex >= currentLevelIndex;
|
|
49
|
+
}
|
|
50
|
+
writeToFile(entry) {
|
|
51
|
+
if (!this.config.enableFile || !this.config.filePath) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const message = (0, logger_utils_1.formatFileMessage)(entry) + '\n';
|
|
56
|
+
fs.appendFileSync(this.config.filePath, message, 'utf8');
|
|
57
|
+
// Rotación de archivos si es necesario
|
|
58
|
+
this.rotateLogFileIfNeeded();
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
// Fallback: escribir en consola si falla el archivo
|
|
62
|
+
console.error('Error escribiendo en archivo de log:', error);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
rotateLogFileIfNeeded() {
|
|
66
|
+
if (!this.config.filePath || !this.config.maxFileSize) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const stats = fs.statSync(this.config.filePath);
|
|
71
|
+
const fileSizeInMB = stats.size / (1024 * 1024);
|
|
72
|
+
if (fileSizeInMB >= this.config.maxFileSize) {
|
|
73
|
+
const logDir = path.dirname(this.config.filePath);
|
|
74
|
+
const logFileName = path.basename(this.config.filePath, '.log');
|
|
75
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
76
|
+
const rotatedFileName = `${logFileName}-${timestamp}.log`;
|
|
77
|
+
const rotatedFilePath = path.join(logDir, rotatedFileName);
|
|
78
|
+
// Mover archivo actual
|
|
79
|
+
fs.renameSync(this.config.filePath, rotatedFilePath);
|
|
80
|
+
// Limpiar archivos antiguos
|
|
81
|
+
this.cleanOldLogFiles(logDir, logFileName);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
// Ignorar errores de rotación
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
cleanOldLogFiles(logDir, logFileName) {
|
|
89
|
+
if (!this.config.maxFiles) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
const files = fs.readdirSync(logDir)
|
|
94
|
+
.filter(file => file.startsWith(logFileName) && file.endsWith('.log'))
|
|
95
|
+
.map(file => ({
|
|
96
|
+
name: file,
|
|
97
|
+
path: path.join(logDir, file),
|
|
98
|
+
time: fs.statSync(path.join(logDir, file)).mtime.getTime(),
|
|
99
|
+
}))
|
|
100
|
+
.sort((a, b) => b.time - a.time);
|
|
101
|
+
// Eliminar archivos que excedan el máximo
|
|
102
|
+
if (files.length > this.config.maxFiles) {
|
|
103
|
+
files.slice(this.config.maxFiles).forEach(file => {
|
|
104
|
+
fs.unlinkSync(file.path);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
// Ignorar errores de limpieza
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
log(level, message, data) {
|
|
113
|
+
if (!this.shouldLog(level)) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const entry = {
|
|
117
|
+
timestamp: new Date().toISOString(),
|
|
118
|
+
level,
|
|
119
|
+
message,
|
|
120
|
+
data,
|
|
121
|
+
};
|
|
122
|
+
// Escribir en consola (si está habilitado)
|
|
123
|
+
if (this.config.enableConsole) {
|
|
124
|
+
console.log((0, logger_utils_1.formatConsoleMessage)(level, message, data));
|
|
125
|
+
}
|
|
126
|
+
// Escribir en archivo (siempre, incluso en producción)
|
|
127
|
+
this.writeToFile(entry);
|
|
128
|
+
}
|
|
129
|
+
error(message, data) {
|
|
130
|
+
this.log('ERROR', message, data);
|
|
131
|
+
}
|
|
132
|
+
warn(message, data) {
|
|
133
|
+
this.log('WARN', message, data);
|
|
134
|
+
}
|
|
135
|
+
info(message, data) {
|
|
136
|
+
this.log('INFO', message, data);
|
|
137
|
+
}
|
|
138
|
+
debug(message, data) {
|
|
139
|
+
this.log('DEBUG', message, data);
|
|
140
|
+
}
|
|
141
|
+
updateConfig(newConfig) {
|
|
142
|
+
this.config = { ...this.config, ...newConfig };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
exports.LoggerService = LoggerService;
|
|
146
|
+
//# sourceMappingURL=logger.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.service.js","sourceRoot":"","sources":["../../src/logger/logger.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type LogLevel = 'ERROR' | 'WARN' | 'INFO' | 'DEBUG';
|
|
2
|
+
export interface LoggerConfig {
|
|
3
|
+
level: LogLevel;
|
|
4
|
+
enableConsole: boolean;
|
|
5
|
+
enableFile: boolean;
|
|
6
|
+
filePath?: string;
|
|
7
|
+
environment: 'development' | 'production';
|
|
8
|
+
maxFileSize?: number;
|
|
9
|
+
maxFiles?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface LogEntry {
|
|
12
|
+
timestamp: string;
|
|
13
|
+
level: LogLevel;
|
|
14
|
+
message: string;
|
|
15
|
+
data?: unknown;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=logger.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.types.d.ts","sourceRoot":"","sources":["../../src/logger/logger.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,QAAQ,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,aAAa,GAAG,YAAY,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.types.js","sourceRoot":"","sources":["../../src/logger/logger.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { LogLevel, LogEntry } from './logger.types';
|
|
2
|
+
export declare const formatConsoleMessage: (level: LogLevel, message: string, data?: unknown) => string;
|
|
3
|
+
export declare const formatFileMessage: (entry: LogEntry) => string;
|
|
4
|
+
export declare const getColorForLevel: (level: LogLevel) => string;
|
|
5
|
+
//# sourceMappingURL=logger.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.utils.d.ts","sourceRoot":"","sources":["../../src/logger/logger.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAUpD,eAAO,MAAM,oBAAoB,GAC/B,OAAO,QAAQ,EACf,SAAS,MAAM,EACf,OAAO,OAAO,KACb,MAaF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,OAAO,QAAQ,KAAG,MASnD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,OAAO,QAAQ,KAAG,MAElD,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getColorForLevel = exports.formatFileMessage = exports.formatConsoleMessage = void 0;
|
|
4
|
+
const colors = {
|
|
5
|
+
ERROR: '\x1b[31m', // Rojo
|
|
6
|
+
WARN: '\x1b[33m', // Amarillo
|
|
7
|
+
INFO: '\x1b[36m', // Cyan
|
|
8
|
+
DEBUG: '\x1b[35m', // Magenta
|
|
9
|
+
RESET: '\x1b[0m',
|
|
10
|
+
};
|
|
11
|
+
const formatConsoleMessage = (level, message, data) => {
|
|
12
|
+
const color = colors[level];
|
|
13
|
+
const reset = colors.RESET;
|
|
14
|
+
const timestamp = new Date().toISOString();
|
|
15
|
+
const levelTag = `[${level}]`;
|
|
16
|
+
let output = `${color}${levelTag}${reset} ${timestamp} - ${message}`;
|
|
17
|
+
if (data !== undefined) {
|
|
18
|
+
output += `\n${JSON.stringify(data, null, 2)}`;
|
|
19
|
+
}
|
|
20
|
+
return output;
|
|
21
|
+
};
|
|
22
|
+
exports.formatConsoleMessage = formatConsoleMessage;
|
|
23
|
+
const formatFileMessage = (entry) => {
|
|
24
|
+
const { timestamp, level, message, data } = entry;
|
|
25
|
+
let output = `${timestamp} [${level}] ${message}`;
|
|
26
|
+
if (data !== undefined) {
|
|
27
|
+
output += ` | Data: ${JSON.stringify(data)}`;
|
|
28
|
+
}
|
|
29
|
+
return output;
|
|
30
|
+
};
|
|
31
|
+
exports.formatFileMessage = formatFileMessage;
|
|
32
|
+
const getColorForLevel = (level) => {
|
|
33
|
+
return colors[level];
|
|
34
|
+
};
|
|
35
|
+
exports.getColorForLevel = getColorForLevel;
|
|
36
|
+
//# sourceMappingURL=logger.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.utils.js","sourceRoot":"","sources":["../../src/logger/logger.utils.ts"],"names":[],"mappings":";;;AAEA,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,UAAU,EAAE,OAAO;IAC1B,IAAI,EAAE,UAAU,EAAG,WAAW;IAC9B,IAAI,EAAE,UAAU,EAAG,OAAO;IAC1B,KAAK,EAAE,UAAU,EAAE,UAAU;IAC7B,KAAK,EAAE,SAAS;CACjB,CAAC;AAEK,MAAM,oBAAoB,GAAG,CAClC,KAAe,EACf,OAAe,EACf,IAAc,EACN,EAAE;IACV,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,KAAK,GAAG,CAAC;IAE9B,IAAI,MAAM,GAAG,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,IAAI,SAAS,MAAM,OAAO,EAAE,CAAC;IAErE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;IACjD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAjBW,QAAA,oBAAoB,wBAiB/B;AAEK,MAAM,iBAAiB,GAAG,CAAC,KAAe,EAAU,EAAE;IAC3D,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAClD,IAAI,MAAM,GAAG,GAAG,SAAS,KAAK,KAAK,KAAK,OAAO,EAAE,CAAC;IAElD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,YAAY,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IAC/C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AATW,QAAA,iBAAiB,qBAS5B;AAEK,MAAM,gBAAgB,GAAG,CAAC,KAAe,EAAU,EAAE;IAC1D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC,CAAC;AAFW,QAAA,gBAAgB,oBAE3B"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "lognerd",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Sistema de logging con colores y escritura a archivo",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"logger",
|
|
9
|
+
"logging",
|
|
10
|
+
"log",
|
|
11
|
+
"file-logger",
|
|
12
|
+
"lognerd"
|
|
13
|
+
],
|
|
14
|
+
"author": "solivoo",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/solivoo/lognerd.git"
|
|
19
|
+
},
|
|
20
|
+
"homepage": "https://github.com/solivoo/lognerd#readme",
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/solivoo/lognerd/issues"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^20.0.0",
|
|
26
|
+
"ts-node": "^10.9.2",
|
|
27
|
+
"typescript": "^5.0.0"
|
|
28
|
+
},
|
|
29
|
+
"peerDependencies": {
|
|
30
|
+
"typescript": "^5.0.0"
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist",
|
|
34
|
+
"README.md"
|
|
35
|
+
],
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsc",
|
|
38
|
+
"dev": "tsc --watch",
|
|
39
|
+
"test": "ts-node test-logger.ts",
|
|
40
|
+
"test:env": "ts-node test-env.ts"
|
|
41
|
+
}
|
|
42
|
+
}
|