Azify Logger Client - Centralized logging for OpenSearch
npm install azify-logger-client-v2Sistema de logging centralizado com OpenTelemetry e OpenSearch para múltiplas aplicações.
Na sua aplicação, adicione ao package.json:
``json`
{
"dependencies": {
"azify-logger-client-v2": "^1.3.1"
}
}
Ou via npm:
`bash`
npm install azify-logger-client-v2
1. No arquivo de inicialização:
`javascript`
#!/usr/bin/env node
require('azify-logger-client-v2/register-otel');
// Resto do código...
2. No servidor Restify:
`javascript
import { middleware as azifyMiddleware } from 'azify-logger-client-v2'
const server = restify.createServer()
server.use(azifyMiddleware.restify())
`
3. Variável de ambiente:
`bash`
APP_NAME=nome-app
PRONTO! 🎉
`javascript
require('azify-logger-client-v2')
const express = require('express')
const app = express()
// Logs automáticos via OpenTelemetry
`
| Variável | Padrão | Descrição |
|----------|-------|-----------|
| APP_NAME | - | Nome da aplicação |AZIFY_LOGGER_URL
| | http://localhost:3000 | URL do logger |OTEL_EXPORTER_OTLP_ENDPOINT
| | http://localhost:4318/v1/traces | OTLP endpoint |NODE_ENV
| | development | Ambiente |AZIFY_LOGGER_AUTOREG_DISABLE
| | "" | Se "1", desativa auto-registro do OTEL |
Para desenvolvimento local: só precisa de APP_NAME (o resto usa defaults)
Para produção: configure todas as URLs apontando para servidores de produção
Se seu container usa uma versão antiga do Node e você ver erros de inicialização do OpenTelemetry (ex.: Cannot find module 'node:events' saindo de google-logging-utils ou @opentelemetry/resource-detector-gcp), defina no container:
`bash`
AZIFY_LOGGER_AUTOREG_DISABLE=1
Isso evita carregar register-otel.js e mantém os envios de log via streams/middleware normalmente, permitindo visualização no OpenSearch.
- ✅ Zero Config: OpenTelemetry habilitado automaticamente
- ✅ Logs Completos: Headers, body, query params, status
- ✅ Trace Consistente: REQUEST e RESPONSE com mesmo traceId/spanId
- ✅ Genérico: Funciona com Bunyan, Pino, console.log ou qualquer logger
- ✅ Centralizado: Todos os logs no OpenSearch
Se sua app já tem Bunyan e você quer adicionar o azify-logger como stream adicional:
`javascript
// Forma segura com try/catch (não quebra se não tiver instalado)
let createAzifyBunyanStream
try {
createAzifyBunyanStream = require('azify-logger-client-v2/streams/bunyan')
} catch (_) {
createAzifyBunyanStream = null
}
const bunyan = require('bunyan')
const streams = [
{ level: 'info', stream: process.stdout }
]
// Adiciona stream do azify-logger se disponível
if (createAzifyBunyanStream) {
streams.push({
level: 'info',
type: 'raw',
stream: createAzifyBunyanStream({
loggerUrl: process.env.AZIFY_LOGGER_URL || 'http://localhost:3000',
serviceName: process.env.APP_NAME || 'app'
})
})
}
const logger = bunyan.createLogger({ name: 'app', streams })
logger.info('Teste') // Vai para stdout E para azify-logger
`
`javascript
require('azify-logger-client-v2')
const bunyan = require('bunyan')
const log = bunyan.createLogger({ name: 'nome-app' })
log.info('Teste') // Automaticamente enviado para azify-logger
`
`javascript
const { streams } = require('azify-logger-client-v2')
const pino = require('pino')
const logger = pino({ level: 'info' }, streams.createPinoStream({
loggerUrl: 'http://localhost:3000',
serviceName: 'nome-app'
}))
logger.info('Teste')
`
`javascript
const { createAzifyLogger } = require('azify-logger-client-v2')
const logger = createAzifyLogger({
serviceName: 'nome-app',
loggerUrl: 'http://localhost:3000'
})
logger.info('Mensagem', { userId: '123' })
logger.error('Erro', new Error('Falha'), { context: 'payment' })
`
---
Se você precisa subir a infraestrutura do azify-logger:
`bash`
./start-docker.sh
Aguarde alguns minutos. Você verá:
``
✅ Tudo pronto!
📊 OpenSearch: http://localhost:9200
🎨 OpenSearch Dashboards: http://localhost:5601
📝 Logger API: http://localhost:3000
🔭 OTEL Collector: http://localhost:4318
`bash`
curl -X POST http://localhost:3000/test-log \
-H "Content-Type: application/json" \
-d '{
"level": "info",
"message": "Teste",
"meta": {"service": {"name": "teste"}}
}'
OpenSearch Dashboards:
`bash`
http://localhost:5601
Como usar:
1. Acesse: http://localhost:5601
2. Para logs detalhados: Vá para Discover
3. Para dashboard profissional: Vá para Dashboard → "Application Health Dashboard"
4. Use os filtros:
- service.name: "nome-da-app" (para filtrar por serviço)appName: "nome-da-app"
- (para filtrar por app)traceId: "valor"
- (para ver logs de uma requisição)statusCode: 400
- (para ver apenas erros)statusCode: 201
- (para ver apenas sucessos)
Cada log no OpenSearch contém:
`json`
{
"timestamp": "2025-10-01T10:15:30.123Z",
"level": "info",
"message": "[REQUEST] POST /api/payment",
"service": {
"name": "nome-app",
"version": "1.0.0"
},
"traceId": "abc123...",
"spanId": "xyz789...",
"method": "POST",
"url": "/api/payment",
"requestBody": { ... },
"statusCode": 200,
"responseTime": 123.45,
"responseBody": { ... },
"environment": "production",
"hostname": "app-server-01"
}
1. OpenTelemetry cria um span para cada request HTTP
2. Middleware captura request e response com o mesmo span ativo
3. Logger envia ambos os logs com traceId e spanId iguais
4. OpenSearch indexa e permite buscar por traceId
``
┌─────────────┐
│ aplicação │
└──────┬──────┘
│ HTTP POST
↓
┌─────────────┐
│ azify-logger│ (recebe logs)
└──────┬──────┘
│
↓
┌─────────────┐
│ OpenSearch │ (armazena)
└──────┬──────┘
│
↓
┌─────────────┐
│ Dashboards |
| OpenSearch │ (visualiza)
└─────────────┘
O azify-logger usa OpenSearch Dashboards para visualização profissional dos logs:
1. 📊 Discover - Visualização e busca de logs
- Filtros por serviço, app, traceId, statusCode
- Busca em tempo real
- Visualização detalhada de cada log
2. 📈 Dashboard Profissional - "Application Health Dashboard"
- Taxa de Sucesso - Percentual de requisições 2xx
- Latência Média - Tempo médio de resposta
- Erros 4xx/5xx - Contador de erros
- Distribuição de Status Codes - Gráfico de pizza
- Requisições por Minuto - Gráfico temporal
- Top Endpoints - Endpoints mais acessados
3. 🔍 Filtros Avançados - Busca poderosa
- service.name: "nome-da-app" - Filtrar por serviçoappName: "nome-da-app"
- - Filtrar por aplicaçãotraceId: "abc123"
- - Ver todos os logs de uma requisiçãostatusCode: [400 TO 499]
- - Ver apenas erros 4xxresponseTime: >1000
- - Ver requisições lentas
`bashLocal
http://localhost:5601