api-stats-logger
Version:
SDK completo de logging e monitoramento de APIs com nova estrutura de logs organizada, auto-instrumentação, dashboard em tempo real e CLI para configuração automática. Suporta logs estruturados por contexto (HTTP, business, security, system) com campos op
220 lines (182 loc) • 5.67 kB
JavaScript
const ApiStatsLogger = require('./index');
// ==============================
// 1. CONFIGURAÇÃO MAIS SIMPLES - Via Environment Variables
// ==============================
// Configurar via .env:
// API_STATS_API_KEY=sua-api-key-aqui
// API_STATS_URL=http://localhost:3000/logs
// API_STATS_SERVICE=example-app
// API_STATS_ENVIRONMENT=development
// Uso mais simples - tudo vem do .env
const logger = new ApiStatsLogger(); // Lê tudo das env vars
// ==============================
// 2. CONFIGURAÇÃO MANUAL COMPLETA
// ==============================
const loggerManual = new ApiStatsLogger({
apiKey: 'sua-api-key-aqui',
url: 'http://localhost:3000/logs',
service: 'example-service',
environment: 'development',
batchSize: 5,
flushInterval: 2000,
captureErrors: true, // Captura erros automáticos
capturePerformance: true // Métricas do sistema
});
// ==============================
// 3. AUTO-INSTRUMENTAÇÃO TOTAL
// ==============================
// Inicialização com detecção automática de framework
const autoLogger = ApiStatsLogger.init({
apiKey: 'sua-api-key-aqui',
service: 'auto-instrumented-app',
autoDetect: true, // Detecta Express, Fastify, Koa, etc.
captureHTTP: true, // Intercepta requests/responses
captureDatabase: true, // Monitora queries de DB
captureErrors: true, // Captura erros automáticos
captureBody: false, // Não captura body por padrão
captureHeaders: false // Não captura headers por padrão
});
// ==============================
// 4. EXEMPLOS DE USO
// ==============================
// Logs com métodos de conveniência
logger.info('Aplicação iniciada', {
port: 3000,
version: '1.0.0',
nodeVersion: process.version
});
logger.error('Erro ao conectar no banco', {
error: 'Connection timeout',
database: 'postgresql',
host: 'localhost'
});
logger.warn('Cache miss', {
key: 'user:123',
service: 'cache-service'
});
logger.debug('Debug info', {
function: 'processUser',
userId: 123,
step: 'validation'
});
// ==============================
// 5. MIDDLEWARE MANUAL PARA EXPRESS
// ==============================
const express = require('express');
const app = express();
// Middleware automático para capturar todas as requisições
app.use(ApiStatsLogger.expressMiddleware({
logger: logger,
captureBody: true, // Captura request/response body
captureHeaders: false, // Não captura headers (segurança)
captureQuery: true, // Captura query parameters
skipPaths: ['/health'], // Pular health checks
maxBodySize: 1024 * 5 // Máximo 5KB de body
}));
app.get('/test', (req, res) => {
logger.info('Endpoint /test acessado', {
requestId: req.requestId, // ID automático da requisição
ip: req.ip
});
res.json({ message: 'Test endpoint', timestamp: new Date() });
});
// ==============================
// 6. MIDDLEWARE PARA NESTJS
// ==============================
// Em seu main.ts do NestJS:
/*
import { ApiStatsLogger } from 'api-stats-logger';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.use(ApiStatsLogger.nestMiddleware({
logger: new ApiStatsLogger(),
captureBody: false,
skipRoutes: ['/health', '/metrics']
}));
await app.listen(3000);
}
*/
// ==============================
// 7. MONITORAMENTO DE PERFORMANCE
// ==============================
// Exemplo de logging de operação customizada
const startTime = Date.now();
// Simular operação
setTimeout(() => {
const duration = Date.now() - startTime;
logger.info('Operação customizada completada', {
type: 'custom_operation',
operation: 'processPayment',
duration,
success: true,
metadata: {
paymentId: 'pay_123',
amount: 99.99,
method: 'credit_card'
}
});
}, 100);
// ==============================
// 8. ESTATÍSTICAS DO LOGGER
// ==============================
setInterval(() => {
const stats = logger.getStats();
console.log('Logger Stats:', {
logs_sent: stats.sent,
logs_failed: stats.failed,
retries: stats.retries,
buffer_size: stats.bufferSize,
last_flush: stats.lastFlush
});
}, 10000); // A cada 10 segundos
// ==============================
// 9. GRACEFUL SHUTDOWN
// ==============================
process.on('SIGINT', async () => {
console.log('Shutting down gracefully...');
// Flush final de todos os logs
await logger.close();
await loggerManual.close();
await autoLogger.close();
console.log('All logs flushed. Goodbye!');
process.exit(0);
});
// ==============================
// 10. TESTE DE DIFERENTES CENÁRIOS
// ==============================
// Simular erro
setTimeout(() => {
logger.error('Erro simulado', {
type: 'simulated_error',
component: 'test',
stack: new Error('Test error').stack
});
}, 1000);
// Simular warning
setTimeout(() => {
logger.warn('Aviso simulado', {
type: 'simulated_warning',
message: 'This is just a test warning'
});
}, 2000);
// Simular múltiplos logs rápidos (teste de batching)
for (let i = 0; i < 20; i++) {
logger.info(`Log rápido ${i}`, {
type: 'batch_test',
index: i,
timestamp: Date.now()
});
}
console.log('🚀 ApiStatsLogger example running...');
console.log('📊 Check your dashboard for logs');
console.log('🔧 Press Ctrl+C to exit gracefully');
// Start Express server se estivermos usando
if (typeof app !== 'undefined') {
app.listen(3001, () => {
logger.info('Express server started', {
type: 'server_start',
port: 3001,
framework: 'express'
});
});
}