@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.
- package/LICENSE +15 -0
- package/README.md +689 -0
- package/dist/configs/log.service.config.d.ts +8 -0
- package/dist/configs/log.service.config.d.ts.map +1 -0
- package/dist/configs/log.service.config.js +50 -0
- package/dist/configs/log.service.config.js.map +1 -0
- package/dist/configs/log.storage.external.s3.config.d.ts +8 -0
- package/dist/configs/log.storage.external.s3.config.d.ts.map +1 -0
- package/dist/configs/log.storage.external.s3.config.js +27 -0
- package/dist/configs/log.storage.external.s3.config.js.map +1 -0
- package/dist/errors/log.error.d.ts +25 -0
- package/dist/errors/log.error.d.ts.map +1 -0
- package/dist/errors/log.error.js +27 -0
- package/dist/errors/log.error.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/log.service.config.interface.d.ts +84 -0
- package/dist/interfaces/log.service.config.interface.d.ts.map +1 -0
- package/dist/interfaces/log.service.config.interface.js +3 -0
- package/dist/interfaces/log.service.config.interface.js.map +1 -0
- package/dist/interfaces/log.storage.base.service.interface.d.ts +21 -0
- package/dist/interfaces/log.storage.base.service.interface.d.ts.map +1 -0
- package/dist/interfaces/log.storage.base.service.interface.js +3 -0
- package/dist/interfaces/log.storage.base.service.interface.js.map +1 -0
- package/dist/interfaces/log.storage.external.s3.service.config.interface.d.ts +39 -0
- package/dist/interfaces/log.storage.external.s3.service.config.interface.d.ts.map +1 -0
- package/dist/interfaces/log.storage.external.s3.service.config.interface.js +3 -0
- package/dist/interfaces/log.storage.external.s3.service.config.interface.js.map +1 -0
- package/dist/middlewares/log.middleware.d.ts +12 -0
- package/dist/middlewares/log.middleware.d.ts.map +1 -0
- package/dist/middlewares/log.middleware.js +63 -0
- package/dist/middlewares/log.middleware.js.map +1 -0
- package/dist/services/log.service.d.ts +224 -0
- package/dist/services/log.service.d.ts.map +1 -0
- package/dist/services/log.service.js +572 -0
- package/dist/services/log.service.js.map +1 -0
- package/dist/services/log.storage.base.service.d.ts +77 -0
- package/dist/services/log.storage.base.service.d.ts.map +1 -0
- package/dist/services/log.storage.base.service.js +107 -0
- package/dist/services/log.storage.base.service.js.map +1 -0
- package/dist/services/log.storage.external.s3.service.d.ts +66 -0
- package/dist/services/log.storage.external.s3.service.d.ts.map +1 -0
- package/dist/services/log.storage.external.s3.service.js +121 -0
- package/dist/services/log.storage.external.s3.service.js.map +1 -0
- package/dist/services/log.storage.external.service.d.ts +17 -0
- package/dist/services/log.storage.external.service.d.ts.map +1 -0
- package/dist/services/log.storage.external.service.js +22 -0
- package/dist/services/log.storage.external.service.js.map +1 -0
- package/dist/services/log.storage.local.service.d.ts +38 -0
- package/dist/services/log.storage.local.service.d.ts.map +1 -0
- package/dist/services/log.storage.local.service.js +96 -0
- package/dist/services/log.storage.local.service.js.map +1 -0
- package/dist/services/log.storage.service.d.ts +62 -0
- package/dist/services/log.storage.service.d.ts.map +1 -0
- package/dist/services/log.storage.service.js +92 -0
- package/dist/services/log.storage.service.js.map +1 -0
- package/dist/types/log.context.type.d.ts +74 -0
- package/dist/types/log.context.type.d.ts.map +1 -0
- package/dist/types/log.context.type.js +3 -0
- package/dist/types/log.context.type.js.map +1 -0
- package/dist/types/log.type.d.ts +45 -0
- package/dist/types/log.type.d.ts.map +1 -0
- package/dist/types/log.type.js +3 -0
- package/dist/types/log.type.js.map +1 -0
- 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
|