@nicollasfrazao/liguelead-log-service 1.0.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.
Files changed (67) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +689 -0
  3. package/dist/configs/log.service.config.d.ts +8 -0
  4. package/dist/configs/log.service.config.d.ts.map +1 -0
  5. package/dist/configs/log.service.config.js +50 -0
  6. package/dist/configs/log.service.config.js.map +1 -0
  7. package/dist/configs/log.storage.external.s3.config.d.ts +8 -0
  8. package/dist/configs/log.storage.external.s3.config.d.ts.map +1 -0
  9. package/dist/configs/log.storage.external.s3.config.js +27 -0
  10. package/dist/configs/log.storage.external.s3.config.js.map +1 -0
  11. package/dist/errors/log.error.d.ts +25 -0
  12. package/dist/errors/log.error.d.ts.map +1 -0
  13. package/dist/errors/log.error.js +27 -0
  14. package/dist/errors/log.error.js.map +1 -0
  15. package/dist/index.d.ts +22 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +35 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/interfaces/log.service.config.interface.d.ts +84 -0
  20. package/dist/interfaces/log.service.config.interface.d.ts.map +1 -0
  21. package/dist/interfaces/log.service.config.interface.js +3 -0
  22. package/dist/interfaces/log.service.config.interface.js.map +1 -0
  23. package/dist/interfaces/log.storage.base.service.interface.d.ts +21 -0
  24. package/dist/interfaces/log.storage.base.service.interface.d.ts.map +1 -0
  25. package/dist/interfaces/log.storage.base.service.interface.js +3 -0
  26. package/dist/interfaces/log.storage.base.service.interface.js.map +1 -0
  27. package/dist/interfaces/log.storage.external.s3.service.config.interface.d.ts +39 -0
  28. package/dist/interfaces/log.storage.external.s3.service.config.interface.d.ts.map +1 -0
  29. package/dist/interfaces/log.storage.external.s3.service.config.interface.js +3 -0
  30. package/dist/interfaces/log.storage.external.s3.service.config.interface.js.map +1 -0
  31. package/dist/middlewares/log.middleware.d.ts +12 -0
  32. package/dist/middlewares/log.middleware.d.ts.map +1 -0
  33. package/dist/middlewares/log.middleware.js +63 -0
  34. package/dist/middlewares/log.middleware.js.map +1 -0
  35. package/dist/services/log.service.d.ts +224 -0
  36. package/dist/services/log.service.d.ts.map +1 -0
  37. package/dist/services/log.service.js +572 -0
  38. package/dist/services/log.service.js.map +1 -0
  39. package/dist/services/log.storage.base.service.d.ts +77 -0
  40. package/dist/services/log.storage.base.service.d.ts.map +1 -0
  41. package/dist/services/log.storage.base.service.js +107 -0
  42. package/dist/services/log.storage.base.service.js.map +1 -0
  43. package/dist/services/log.storage.external.s3.service.d.ts +66 -0
  44. package/dist/services/log.storage.external.s3.service.d.ts.map +1 -0
  45. package/dist/services/log.storage.external.s3.service.js +121 -0
  46. package/dist/services/log.storage.external.s3.service.js.map +1 -0
  47. package/dist/services/log.storage.external.service.d.ts +17 -0
  48. package/dist/services/log.storage.external.service.d.ts.map +1 -0
  49. package/dist/services/log.storage.external.service.js +22 -0
  50. package/dist/services/log.storage.external.service.js.map +1 -0
  51. package/dist/services/log.storage.local.service.d.ts +38 -0
  52. package/dist/services/log.storage.local.service.d.ts.map +1 -0
  53. package/dist/services/log.storage.local.service.js +96 -0
  54. package/dist/services/log.storage.local.service.js.map +1 -0
  55. package/dist/services/log.storage.service.d.ts +62 -0
  56. package/dist/services/log.storage.service.d.ts.map +1 -0
  57. package/dist/services/log.storage.service.js +92 -0
  58. package/dist/services/log.storage.service.js.map +1 -0
  59. package/dist/types/log.context.type.d.ts +74 -0
  60. package/dist/types/log.context.type.d.ts.map +1 -0
  61. package/dist/types/log.context.type.js +3 -0
  62. package/dist/types/log.context.type.js.map +1 -0
  63. package/dist/types/log.type.d.ts +45 -0
  64. package/dist/types/log.type.d.ts.map +1 -0
  65. package/dist/types/log.type.js +3 -0
  66. package/dist/types/log.type.js.map +1 -0
  67. package/package.json +64 -0
package/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2025, LigueLead
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,689 @@
1
+ # Log Service Node.js
2
+
3
+ Este é um **serviço de logging standalone** para aplicações Express com armazenamento multi-destino (arquivos locais + S3 via Kinesis Firehose) e rastreamento abrangente de requisições. O serviço utiliza o **padrão strategy** com classes base abstratas para destinos de armazenamento.
4
+
5
+ ## Instalação
6
+
7
+ ```bash
8
+ npm install @ligue-lead-tech/log-service-nodejs
9
+ ```
10
+
11
+ ## Uso Rápido
12
+
13
+ ### 1. Configuração Básica
14
+
15
+ ```typescript
16
+ import express from 'express';
17
+ import { LogService, loggingMiddleware } from '@ligue-lead-tech/log-service-nodejs';
18
+
19
+ const app = express();
20
+
21
+ // Configure as variáveis de ambiente
22
+ process.env.LOG_USE = 'true';
23
+ process.env.LOG_LEVEL = 'info';
24
+ process.env.LOG_DESTINATION = 'both'; // 'console', 'storage', ou 'both'
25
+ process.env.NODE_ENV = 'development';
26
+
27
+ // Adicione o middleware de logging (obrigatório para correlation IDs)
28
+ app.use(loggingMiddleware);
29
+
30
+ // Suas rotas
31
+ app.get('/api/users', (req, res) => {
32
+ // O middleware já loga automaticamente requisições e respostas
33
+
34
+ // Logging manual com contexto da requisição
35
+ const context = LogService.createContextFromRequest(req);
36
+ LogService.info('Buscando usuários', context);
37
+
38
+ res.json({ users: [] });
39
+ });
40
+
41
+ app.listen(3000, () => {
42
+ LogService.info('Servidor iniciado', {
43
+ method: 'SYSTEM',
44
+ url: 'localhost:3000',
45
+ ip: '127.0.0.1'
46
+ });
47
+ });
48
+ ```
49
+
50
+ ### 2. Configuração com S3 via Kinesis Firehose
51
+
52
+ ```typescript
53
+ // Configuração para produção com S3
54
+ process.env.LOG_USE_S3_STORAGE = 'true';
55
+ process.env.LOG_FIREHOSE_STREAM_NAME = 'my-app-logs-firehose';
56
+ process.env.LOG_AWS_REGION = 'us-east-1';
57
+
58
+ // Para desenvolvimento com LocalStack
59
+ process.env.LOG_AWS_ENDPOINT = 'http://localhost:4566';
60
+ process.env.LOG_AWS_ACCESS_KEY_ID = 'test';
61
+ process.env.LOG_AWS_SECRET_ACCESS_KEY = 'test';
62
+ ```
63
+
64
+ ### 3. Logging Manual
65
+
66
+ ```typescript
67
+ import { LogService, LogError } from '@ligue-lead-tech/log-service-nodejs';
68
+
69
+ // Logging simples
70
+ LogService.info('Operação realizada', {
71
+ method: 'POST',
72
+ url: '/api/users',
73
+ ip: '192.168.1.1'
74
+ });
75
+
76
+ LogService.error('Erro na operação', {
77
+ method: 'POST',
78
+ url: '/api/users',
79
+ ip: '192.168.1.1',
80
+ error: 'Database connection failed'
81
+ });
82
+
83
+ // Erro customizado que loga automaticamente
84
+ throw new LogError('Usuário não encontrado', 404, { userId: 123 });
85
+ ```
86
+
87
+ ### 4. Logging de APIs Externas
88
+
89
+ ```typescript
90
+ import { LogService } from '@ligue-lead-tech/log-service-nodejs';
91
+ import axios from 'axios';
92
+
93
+ app.post('/api/process', async (req, res) => {
94
+ try {
95
+ // Loga automaticamente request/response da API externa
96
+ const response = await LogService.executeRequestWithLogging(
97
+ req, // Request Express (para correlation)
98
+ () => axios.post('https://api.external.com/data', { data: 'test' }),
99
+ 'POST', 'https://api.external.com/data', { data: 'test' }
100
+ );
101
+
102
+ res.json(response.data);
103
+ } catch (error) {
104
+ res.status(500).json({ error: 'Failed to process' });
105
+ }
106
+ });
107
+ ```
108
+
109
+ ## Características Principais
110
+
111
+ - ✅ **Logging automático** de todas as requisições HTTP
112
+ - ✅ **Correlation ID único** para rastreamento de requisições
113
+ - ✅ **Medição de tempo de resposta**
114
+ - ✅ **Sanitização automática** de dados sensíveis
115
+ - ✅ **Logging estruturado** em formato JSON
116
+ - ✅ **Configuração por ambiente** (development, homologation, production, test)
117
+ - ✅ **Diferentes níveis de log** (debug, info, warn, error)
118
+ - ✅ **Armazenamento via Kinesis Firehose** para S3 com buffering e compressão
119
+ - ✅ **Fallback para armazenamento local** em caso de falha do S3
120
+ - ✅ **Padrão de serviço estático** - sem necessidade de instanciação
121
+
122
+ ## Estrutura dos Arquivos de Log
123
+
124
+ Os logs são organizados por ambiente e salvos via **Kinesis Firehose** para S3, com fallback para arquivos locais:
125
+
126
+ ### Armazenamento S3 (via Kinesis Firehose)
127
+ ```
128
+ ll-api-logs/
129
+ ├── logs/
130
+ │ ├── development/
131
+ │ │ └── 2025-10-27-combined.log.gz # Logs comprimidos pelo Firehose
132
+ │ ├── production/
133
+ │ │ └── 2025-10-27-combined.log.gz
134
+ │ ├── homologation/
135
+ │ │ └── 2025-10-27-combined.log.gz
136
+ │ └── test/
137
+ │ └── 2025-10-27-combined.log.gz
138
+ ```
139
+
140
+ ### Armazenamento Local (Fallback)
141
+ ```
142
+ src/storage/logs/
143
+ ├── development/ # Ambiente de desenvolvimento
144
+ │ └── 2025-10-27-combined.log # Todos os logs do dia específico
145
+ ├── production/ # Ambiente de produção
146
+ │ └── 2025-10-27-combined.log
147
+ ├── homologation/ # Ambiente de homologação
148
+ │ └── 2025-10-27-combined.log
149
+ └── test/ # Ambiente de testes
150
+ └── 2025-10-27-combined.log
151
+ ```
152
+
153
+ ## Destinos de Log
154
+
155
+ O sistema suporta diferentes destinos para os logs através da variável `LOG_DESTINATION`:
156
+
157
+ ### 1. Storage (`LOG_DESTINATION="storage"`)
158
+ - Logs são salvos apenas em arquivos locais ou S3
159
+ - Não aparecem no console da aplicação
160
+ - Ideal para produção onde você não quer poluir os logs do Lambda/container
161
+
162
+ ### 2. Console (`LOG_DESTINATION="console"`)
163
+ - Logs aparecem apenas no console da aplicação
164
+ - Não são salvos em arquivos ou S3
165
+ - Útil para desenvolvimento local ou debugging
166
+
167
+ ### 3. Both (`LOG_DESTINATION="both"`)
168
+ - Logs são salvos em arquivos/S3 E aparecem no console
169
+ - Máxima visibilidade e persistência
170
+ - Útil para ambientes de homologação
171
+
172
+ ### Armazenamento S3 via Kinesis Firehose
173
+
174
+ Quando `LOG_USE_S3_STORAGE=true`, os logs são enviados para **Kinesis Firehose** que faz a entrega otimizada para S3:
175
+
176
+ - **Firehose Stream**: Definido por `LOG_FIREHOSE_STREAM_NAME`
177
+ - **Bucket S3**: Configurado no Firehose Stream
178
+ - **Estrutura**: `logs/{prefix}/` (definido na configuração do Firehose)
179
+ - **Buffering**: Firehose agrupa logs em batches para eficiência
180
+ - **Compressão**: Logs são automaticamente comprimidos (GZIP)
181
+ - **Endpoint**: Configurável via `LOG_AWS_ENDPOINT` (útil para LocalStack)
182
+ - **Credenciais**: Via variáveis de ambiente AWS ou perfis IAM
183
+
184
+ Exemplo de estrutura no S3 via Firehose:
185
+ ```
186
+ ll-api-logs/
187
+ ├── logs/
188
+ │ ├── 2025/10/27/14/
189
+ │ │ ├── firehose_output-1-2025-10-27-14-01-01-uuid.gz
190
+ │ │ └── firehose_output-2-2025-10-27-14-02-01-uuid.gz
191
+ │ └── error-logs/ # Logs com erro de entrega
192
+ │ └── processing-failed/
193
+ ```
194
+
195
+ ## Configuração
196
+
197
+ ### Variáveis de Ambiente
198
+
199
+ O serviço é configurado através de variáveis de ambiente. Aqui estão as principais:
200
+
201
+ #### Configurações Essenciais
202
+ ```bash
203
+ # Controle principal
204
+ LOG_USE=true # Ativa/desativa o sistema de logging
205
+ LOG_LEVEL=info # debug|info|warn|error
206
+ LOG_DESTINATION=both # storage|console|both
207
+ NODE_ENV=development # development|production|homologation|test
208
+
209
+ # S3 via Kinesis Firehose
210
+ LOG_USE_S3_STORAGE=true # Ativa envio para S3 via Firehose
211
+ LOG_FIREHOSE_STREAM_NAME=my-app-logs # Nome do stream Kinesis Firehose
212
+
213
+ # AWS (apenas para desenvolvimento/LocalStack)
214
+ LOG_AWS_ENDPOINT=http://localhost:4566 # Endpoint AWS (LocalStack)
215
+ LOG_AWS_REGION=us-east-1 # Região AWS
216
+ LOG_AWS_ACCESS_KEY_ID=test # Access Key (dev only)
217
+ LOG_AWS_SECRET_ACCESS_KEY=test # Secret Key (dev only)
218
+
219
+ # Controle de conteúdo
220
+ LOG_INCLUDE_REQUEST_BODY=true # Inclui corpo da requisição
221
+ LOG_INCLUDE_RESPONSE_BODY=true # Inclui corpo da resposta
222
+ LOG_MAX_BODY_SIZE=5000 # Tamanho máximo dos corpos (bytes)
223
+ ```
224
+
225
+ #### Configuração para Diferentes Ambientes
226
+
227
+ **Desenvolvimento Local:**
228
+ ```bash
229
+ LOG_USE=true
230
+ LOG_LEVEL=debug
231
+ LOG_DESTINATION=both
232
+ LOG_USE_S3_STORAGE=false
233
+ ```
234
+
235
+ **Produção:**
236
+ ```bash
237
+ LOG_USE=true
238
+ LOG_LEVEL=info
239
+ LOG_DESTINATION=storage
240
+ LOG_USE_S3_STORAGE=true
241
+ LOG_FIREHOSE_STREAM_NAME=production-logs-firehose
242
+ ```
243
+
244
+ **Desenvolvimento com LocalStack:**
245
+ ```bash
246
+ LOG_USE=true
247
+ LOG_LEVEL=debug
248
+ LOG_DESTINATION=both
249
+ LOG_USE_S3_STORAGE=true
250
+ LOG_AWS_ENDPOINT=http://localhost:4566
251
+ LOG_FIREHOSE_STREAM_NAME=dev-logs-firehose
252
+ LOG_AWS_ACCESS_KEY_ID=test
253
+ LOG_AWS_SECRET_ACCESS_KEY=test
254
+ ```
255
+
256
+ ### Configuração Programática
257
+
258
+ Você também pode configurar o serviço programaticamente:
259
+
260
+ ```typescript
261
+ import { LogService } from '@ligue-lead-tech/log-service-nodejs';
262
+
263
+ // Configurar correlation ID personalizado
264
+ LogService.setCorrelationId('custom-correlation-id');
265
+
266
+ // Criar contexto personalizado
267
+ const customContext = {
268
+ method: 'POST',
269
+ url: '/api/custom',
270
+ ip: '192.168.1.1',
271
+ user_id: 'user123',
272
+ custom_field: 'custom_value'
273
+ };
274
+
275
+ LogService.info('Mensagem personalizada', customContext);
276
+ ```
277
+
278
+ ### Configurações Avançadas
279
+
280
+ O sistema usa as configurações definidas em `src/configs/log.service.config.ts`. As principais opções incluem:
281
+
282
+ - `includeRequestBody`: Para incluir o corpo da requisição nos logs
283
+ - `includeResponseBody`: Para incluir o corpo da resposta nos logs
284
+ - `includeRequestHeaders`: Para incluir headers da requisição
285
+ - `sensitiveFields`: Lista de campos sensíveis que serão mascarados
286
+ - `maxBodySize`: Tamanho máximo do corpo da requisição/resposta a ser logado
287
+ - `logExternalRequestCalls`: Para logging de chamadas para APIs externas
288
+
289
+ ### Variáveis de Ambiente
290
+
291
+ ```bash
292
+ # ===== CONFIGURAÇÕES PRINCIPAIS =====
293
+
294
+ # Habilita/desabilita logging completamente
295
+ LOG_USE=true
296
+
297
+ # Nível de logging (debug|info|warn|error)
298
+ LOG_LEVEL=info
299
+
300
+ # Nome do serviço (aparece nos logs)
301
+ LOG_SERVICE_NAME=my-service
302
+
303
+ # Prefixo para mensagens de log
304
+ LOG_PREFIX=[MY-APP]
305
+
306
+ # ===== CONFIGURAÇÕES DE CONTEÚDO =====
307
+
308
+ # Incluir corpo das requisições nos logs
309
+ LOG_INCLUDE_REQUEST_BODY=true
310
+
311
+ # Incluir corpo das respostas nos logs
312
+ LOG_INCLUDE_RESPONSE_BODY=true
313
+
314
+ # Incluir headers das requisições
315
+ LOG_INCLUDE_REQUEST_HEADERS=true
316
+
317
+ # Tamanho máximo do corpo para logging (bytes)
318
+ LOG_MAX_BODY_SIZE=5000
319
+
320
+ # Logging de chamadas para APIs externas
321
+ LOG_EXTERNAL_REQUEST_CALLS=true
322
+
323
+ # ===== CONFIGURAÇÕES DE DESTINO DOS LOGS =====
324
+
325
+ # Destino dos logs (storage|console|both)
326
+ # - storage: salva apenas em arquivos/S3
327
+ # - console: exibe apenas no console
328
+ # - both: salva em arquivos/S3 e exibe no console
329
+ LOG_DESTINATION=storage
330
+
331
+ # ===== CONFIGURAÇÕES DE ARMAZENAMENTO S3 VIA KINESIS FIREHOSE =====
332
+
333
+ # Habilita armazenamento no S3 via Kinesis Firehose (true|false)
334
+ LOG_USE_S3_STORAGE=true
335
+
336
+ # Nome do Kinesis Firehose stream
337
+ LOG_FIREHOSE_STREAM_NAME=ll-api-logs-firehose
338
+
339
+ # Região AWS
340
+ LOG_AWS_REGION=us-east-1
341
+
342
+ # Endpoint do S3/Firehose (para LocalStack)
343
+ LOG_AWS_ENDPOINT=http://localhost:4566
344
+
345
+ # Credenciais AWS (se não usando perfil/role)
346
+ LOG_AWS_ACCESS_KEY_ID=test
347
+ LOG_AWS_SECRET_ACCESS_KEY=test
348
+ ```
349
+
350
+ ### Configurações por Ambiente
351
+
352
+ O sistema detecta automaticamente o ambiente atual através da variável `NODE_ENV`:
353
+
354
+ - `NODE_ENV=development` → logs salvos em `logs/development/`
355
+ - `NODE_ENV=production` → logs salvos em `logs/production/`
356
+ - `NODE_ENV=homologation` → logs salvos em `logs/homologation/`
357
+ - `NODE_ENV=test` → logs salvos em `logs/test/`
358
+ - Sem `NODE_ENV` definido → logs salvos em `logs/development/` (padrão)
359
+
360
+ - **Development**: Logs completos com cores
361
+ - **Homologation**: Logs limitados sem cores
362
+ - **Production**: Apenas warnings/errors, dados mínimos
363
+ - **Test**: Apenas errors, logging mínimo
364
+
365
+ ### Exemplos de Configuração por Ambiente
366
+
367
+ #### Desenvolvimento Local (com LocalStack)
368
+ ```bash
369
+ NODE_ENV=development
370
+ LOG_USE=true
371
+ LOG_LEVEL=debug
372
+ LOG_DESTINATION=both
373
+ LOG_USE_S3_STORAGE=true
374
+ LOG_FIREHOSE_STREAM_NAME=ll-api-logs-firehose
375
+ LOG_AWS_ENDPOINT=http://localhost:4566
376
+ LOG_AWS_ACCESS_KEY_ID=test
377
+ LOG_AWS_SECRET_ACCESS_KEY=test
378
+ ```
379
+
380
+ #### Homologação
381
+ ```bash
382
+ NODE_ENV=homologation
383
+ LOG_USE=true
384
+ LOG_LEVEL=info
385
+ LOG_DESTINATION=storage
386
+ LOG_USE_S3_STORAGE=true
387
+ LOG_FIREHOSE_STREAM_NAME=ll-api-logs-firehose-hml
388
+ # AWS credentials via IAM role ou environment variables
389
+ ```
390
+
391
+ #### Produção
392
+ ```bash
393
+ NODE_ENV=production
394
+ LOG_USE=true
395
+ LOG_LEVEL=warn
396
+ LOG_DESTINATION=storage
397
+ LOG_USE_S3_STORAGE=true
398
+ LOG_FIREHOSE_STREAM_NAME=ll-api-logs-firehose-prod
399
+ LOG_INCLUDE_REQUEST_BODY=false
400
+ LOG_INCLUDE_RESPONSE_BODY=false
401
+ LOG_MAX_BODY_SIZE=1000
402
+ # AWS credentials via IAM role
403
+ ```
404
+
405
+ ## Estrutura dos Logs
406
+
407
+ ### Log de Requisição
408
+ ```json
409
+ {
410
+ "timestamp": "2025-10-27T10:30:00.000Z",
411
+ "level": "info",
412
+ "environment": "development",
413
+ "service": "log-service",
414
+ "correlation_id": "550e8400-e29b-41d4-a716-446655440000",
415
+ "message": "[MY-APP] Incoming request",
416
+ "context": {
417
+ "method": "POST",
418
+ "url": "/v1/voice/send",
419
+ "userAgent": "PostmanRuntime/7.32.3",
420
+ "ip": "192.168.1.100",
421
+ "headers": {
422
+ "content-type": "application/json",
423
+ "authorization": "[REDACTED]"
424
+ },
425
+ "requestBody": {
426
+ "title": "Test Voice Message",
427
+ "voice_upload_id": 123,
428
+ "phones": ["[REDACTED]", "[REDACTED]"]
429
+ }
430
+ }
431
+ }
432
+ ```
433
+
434
+ ### Log de Resposta
435
+ ```json
436
+ {
437
+ "timestamp": "2025-10-27T10:30:01.500Z",
438
+ "level": "info",
439
+ "environment": "development",
440
+ "service": "log-service",
441
+ "correlation_id": "550e8400-e29b-41d4-a716-446655440000",
442
+ "message": "[MY-APP] Request completed successfully",
443
+ "context": {
444
+ "method": "POST",
445
+ "url": "/v1/voice/send",
446
+ "statusCode": 200,
447
+ "responseTime": 1500,
448
+ "responseBody": {
449
+ "message": "Voice sent successfully",
450
+ "data": {
451
+ "campaign_id": "12345"
452
+ }
453
+ }
454
+ }
455
+ }
456
+ ```
457
+
458
+ ## Como Usar
459
+
460
+ ### 1. Instalação
461
+ ```bash
462
+ npm install
463
+ ```
464
+
465
+ ### 2. Dependências
466
+ ```json
467
+ {
468
+ "dependencies": {
469
+ "@types/express": "^5.0.4",
470
+ "@aws-sdk/client-s3": "^3.658.1",
471
+ "@aws-sdk/client-firehose": "^3.658.1",
472
+ "express": "^5.1.0",
473
+ "uuid": "^9.0.1"
474
+ },
475
+ "devDependencies": {
476
+ "@types/dotenv": "^8.2.3",
477
+ "@types/uuid": "^9.0.8",
478
+ "dotenv": "^17.2.3"
479
+ }
480
+ }
481
+ ```
482
+
483
+ ### 3. Estrutura do Projeto
484
+ ```
485
+ src/
486
+ ├── configs/ # Configurações
487
+ │ ├── log.service.config.ts
488
+ │ └── log.storage.external.s3.config.ts
489
+ ├── errors/ # Erros customizados
490
+ │ └── log.error.ts
491
+ ├── interfaces/ # Interfaces TypeScript
492
+ │ ├── log.service.config.interface.ts
493
+ │ ├── log.storage.base.service.interface.ts
494
+ │ └── log.storage.external.s3.service.config.interface.ts
495
+ ├── middlewares/ # Middlewares Express
496
+ │ └── log.middleware.ts
497
+ ├── services/ # Serviços principais
498
+ │ ├── log.service.ts # Serviço principal (estático)
499
+ │ ├── log.storage.base.service.ts # Classe base abstrata
500
+ │ ├── log.storage.local.service.ts # Armazenamento local
501
+ │ ├── log.storage.external.s3.service.ts # Armazenamento S3 via Firehose
502
+ │ ├── log.storage.external.service.ts
503
+ │ └── log.storage.service.ts # Orquestrador de storage
504
+ ├── storage/ # Diretório de logs locais
505
+ │ └── logs/
506
+ │ └── development/ # Logs por ambiente
507
+ └── types/ # Tipos TypeScript
508
+ ├── log.context.type.ts
509
+ └── log.type.ts
510
+ scripts/ # Scripts utilitários
511
+ └── setup-localstack-firehose.sh # Configuração LocalStack
512
+ ```
513
+
514
+ ### 4. Middleware de Logging Automático
515
+ O middleware de logging é aplicado automaticamente a todas as rotas:
516
+
517
+ ```typescript
518
+ import { loggingMiddleware } from './src/middlewares/log.middleware';
519
+
520
+ app.use(loggingMiddleware);
521
+ ```
522
+
523
+ ### 5. Logging Manual
524
+ ```typescript
525
+ import { LogService } from './src/services/log.service';
526
+
527
+ // Métodos estáticos - sem necessidade de instanciação
528
+ LogService.info("Operação realizada", context);
529
+ LogService.warn("Aviso importante", { data: someData });
530
+ LogService.error("Erro ocorreu", { error: err.message, ...context });
531
+ LogService.debug("Informação de debug", { debugData: details });
532
+
533
+ // Criar contexto a partir da requisição Express
534
+ const context = LogService.createContextFromRequest(req);
535
+ LogService.info("Operação customizada", context);
536
+ ```
537
+
538
+ ### 6. Logging de Requisições Externas
539
+ ```typescript
540
+ // Use executeRequestWithLogging para chamadas externas
541
+ const response = await LogService.executeRequestWithLogging<T>(
542
+ req,
543
+ () => axios.post(externalApiUrl, data),
544
+ 'POST',
545
+ externalApiUrl,
546
+ data
547
+ );
548
+ ```
549
+
550
+ ## Campos Sanitizados
551
+
552
+ Os seguintes campos são automaticamente mascarados nos logs:
553
+ - `password` / `senha`
554
+ - `token` / `access_token` / `refresh_token`
555
+ - `authorization`
556
+ - `credit_card` / `creditCard`
557
+ - `cpf` / `cnpj`
558
+ - `phone` / `phones` / `telefone` / `numbers` / `number`
559
+ - `email`
560
+ - `api_key`
561
+ - `secret`
562
+ - `private_key`
563
+
564
+ A sanitização é aplicada recursivamente a objetos aninhados com proteção contra referências circulares.
565
+
566
+
567
+ ## Análise de Performance
568
+
569
+ Os logs incluem métricas importantes para análise:
570
+ - **responseTime**: Tempo total da requisição
571
+ - **statusCode**: Código de status HTTP
572
+ - **method**: Método HTTP utilizado
573
+ - **url**: Endpoint acessado
574
+
575
+ ## Monitoramento
576
+
577
+ ### Logs Importantes para Alertas
578
+ 1. **Errors (level: error)**: Problemas críticos
579
+ 2. **Alta latência (responseTime > 5000ms)**: Performance
580
+ 3. **Status codes 5xx**: Errors do servidor
581
+ 4. **Status codes 4xx**: Errors do cliente
582
+ 5. **Falhas do Firehose**: Logs que falharam na entrega para S3
583
+
584
+ ### Métricas Recomendadas
585
+ - Taxa de requisições por minuto
586
+ - Tempo médio de resposta
587
+ - Taxa de errors por endpoint
588
+ - Distribuição de status codes
589
+ - Sucesso/falha de entrega do Firehose
590
+ - Tamanho dos batches enviados ao S3
591
+
592
+ ### Monitoramento AWS
593
+ - **CloudWatch Logs**: Monitore os logs do Firehose para detectar falhas
594
+ - **CloudWatch Metrics**:
595
+ - `DeliveryToS3.Records` - registros entregues com sucesso
596
+ - `DeliveryToS3.Success` - entregas bem-sucedidas
597
+ - `DeliveryToS3.DataFreshness` - latência da entrega
598
+ - **S3 Bucket Metrics**: Monitore o crescimento e padrões dos logs
599
+
600
+ ## Arquitetura
601
+
602
+ ### Componentes Principais
603
+
604
+ - **LogService**: Serviço principal estático - ponto de entrada para todas as operações de logging
605
+ - **LogStorageService**: Orquestra múltiplos destinos de armazenamento (local + S3 via Firehose)
606
+ - **Padrão Strategy**: `LogStorageBaseService` → `LogStorageLocalService` + `LogStorageExternalS3Service`
607
+ - **Middleware**: Auto-logging de requisições/respostas HTTP com correlation IDs
608
+ - **Kinesis Firehose Integration**: Entrega otimizada para S3 com buffering, compressão e retry automático
609
+
610
+ ### Decisões Arquiteturais Críticas
611
+
612
+ 1. **Padrão de Serviço Estático**: `LogService` é inteiramente estático - sem necessidade de instanciação
613
+ 2. **Escritas baseadas em Queue**: Usa Map de Promises `writeQueue` para prevenir escritas concorrentes no Firehose
614
+ 3. **Organização baseada em Ambiente**: `logs/{environment}/{date}-combined.log`
615
+ 4. **Kinesis Firehose**: Logs enviados via Firehose com fallback para armazenamento local
616
+ 5. **Rastreamento por Correlation ID**: Correlação baseada em UUID através de todas as entradas de log
617
+ 6. **Buffering Inteligente**: Firehose agrupa logs para otimizar entregas ao S3
618
+
619
+ ## Exemplo de Implementação
620
+
621
+ Para integrar o serviço em sua aplicação Express:
622
+
623
+ ```typescript
624
+ import express from 'express';
625
+ import { loggingMiddleware } from './src/middlewares/log.middleware';
626
+ import { LogService } from './src/services/log.service';
627
+
628
+ const app = express();
629
+
630
+ // Aplicar middleware de logging
631
+ app.use(loggingMiddleware);
632
+
633
+ // Exemplo de uso manual
634
+ app.get('/health', (req, res) => {
635
+ const context = LogService.createContextFromRequest(req);
636
+ LogService.info('Health check realizado', context);
637
+
638
+ res.json({ status: 'OK' });
639
+ });
640
+
641
+ app.listen(3000, () => {
642
+ LogService.info('Servidor iniciado', {
643
+ method: 'GET',
644
+ url: '/startup',
645
+ ip: '127.0.0.1',
646
+ port: 3000
647
+ });
648
+ });
649
+ ```
650
+
651
+ ## Troubleshooting
652
+
653
+ ### Performance
654
+ - Ajuste `LOG_MAX_BODY_SIZE` para reduzir tamanho dos logs
655
+ - Use `LOG_LEVEL=warn` em produção para reduzir volume
656
+ - Desabilite logging de bodies em produção se necessário
657
+
658
+ ### Armazenamento
659
+ - Configure rotação de logs no ambiente de produção
660
+ - Use ferramentas como ELK Stack ou CloudWatch para centralização
661
+ - Considere usar async logging para alta performance
662
+
663
+ ### Debugging
664
+ - Use `LOG_LEVEL=debug` temporariamente para investigação
665
+ - Ative `LOG_INCLUDE_REQUEST_BODY=true` para debug de payloads
666
+ - Use o `requestId` para rastrear requisições específicas
667
+
668
+ ### Destinos de Log
669
+ - **Logs não aparecem**: Verifique `LOG_DESTINATION` e certifique-se que não está apenas em `storage`
670
+ - **Kinesis Firehose não funciona**: Verifique credenciais AWS, se o stream existe e se `LOG_USE_S3_STORAGE=true`
671
+ - **LocalStack**:
672
+ - Execute o script `./scripts/setup-localstack-firehose.sh` primeiro
673
+ - Certifique-se que `LOG_AWS_ENDPOINT=http://localhost:4566` está configurado
674
+ - Verifique se o LocalStack está rodando na porta 4566
675
+ - **Performance**: Use `LOG_DESTINATION=storage` para evitar latência do console
676
+
677
+ ### Kinesis Firehose
678
+ - **Stream não existe**: Execute o script de configuração do LocalStack ou crie manualmente na AWS
679
+ - **Logs não chegam no S3**: Firehose tem buffering - aguarde ou reduza o `IntervalInSeconds`
680
+ - **Falha na entrega**: Logs automaticamente fazem fallback para armazenamento local
681
+ - **Monitoramento**: Verifique CloudWatch Logs do Firehose para erros de entrega
682
+
683
+ ### Erros Comuns
684
+ - **Serviço não instancia**: `LogService` é estático - use `LogService.info()` diretamente
685
+ - **Correlation ID perdido**: Certifique-se que o middleware está aplicado antes das rotas
686
+ - **Dados sensíveis expostos**: Verifique se os campos estão na lista `sensitiveFields`
687
+ - **Firehose PutRecord falha**: Verifique credenciais AWS e se o stream existe
688
+ - **Logs duplicados**: Não instancie `LogService` - ele é estático
689
+ - **Queue de escrita**: Não modifique `writeQueue` diretamente - use os métodos do serviço
@@ -0,0 +1,8 @@
1
+ import { LogServiceConfigInterface } from "../interfaces/log.service.config.interface";
2
+ /**
3
+ * Get logging configuration
4
+ *
5
+ * @returns {LogServiceConfigInterface}
6
+ */
7
+ export declare const getLogServiceConfig: () => LogServiceConfigInterface;
8
+ //# sourceMappingURL=log.service.config.d.ts.map