Este projeto fornece uma solução dockerizada e flexível para coletar, processar e armazenar logs no PostgreSQL usando Fluent Bit. Simplifica a integração de logs de diferentes fontes com um banco de dados PostgreSQL.
- 🔄 Coleta de logs de múltiplas fontes
- 🧩 Configuração dinâmica via variáveis de ambiente
- 🔒 Suporte a diferentes níveis de log
- 📦 Empacotado como imagem Docker para fácil implantação
- Docker
- PostgreSQL
- Conhecimentos básicos de Fluent Bit
git clone https://github.com/seu-usuario/fluent-bit-postgres-storage
cd fluent-bit-postgres-storage
docker build -t fluent-bit-postgres .
FLB_FLUSH
: Intervalo de flush em segundos (padrão: 1)FLB_LOG_LEVEL
: Nível de log (debug, info, warn, error)FLB_INPUT_NAME
: Nome da fonte de entrada (padrão: tail)FLB_INPUT_PATH
: Caminho dos logs para monitorarFLB_INPUT_PARSER
: Parser para os logs (json, etc)FLB_MATCH
: Tag para correspondência de logs
FLB_OUTPUT_HOST
: Endereço do host do PostgreSQLFLB_OUTPUT_PORT
: Porta do PostgreSQL (padrão: 5432)FLB_OUTPUT_DATABASE
: Nome do banco de dadosFLB_OUTPUT_USER
: Usuário do banco de dadosFLB_OUTPUT_PASSWORD
: Senha do banco de dadosFLB_OUTPUT_TABLE
: Nome da tabela para armazenar logs
FLB_ENABLED_ONLY_LEVEL
: Habilitar filtro para descartar logs por nível (true/false)FLB_LEVEL_FILTER_ONLY_LEVEL
: Nível de log a ser descartado antes da inserção no banco (debug, info, etc)
Nota: Quando habilitado, logs no nível especificado serão completamente descartados e NÃO serão inseridos no banco de dados.
docker run -d \
-e FLB_FLUSH=1 \
-e FLB_LOG_LEVEL=debug \
-e FLB_INPUT_NAME=tail \
-e FLB_INPUT_PATH=/var/log/app.log \
-e FLB_INPUT_PARSER=json \
-e FLB_MATCH=patrimony \
-e FLB_OUTPUT_HOST=db \
-e FLB_OUTPUT_PORT=5432 \
-e FLB_OUTPUT_DATABASE=patrimony \
-e FLB_OUTPUT_USER=patrimony \
-e FLB_OUTPUT_PASSWORD=patrimony \
-e FLB_OUTPUT_TABLE=logs \
fluent-bit-postgres
fluent-bit.template.conf
: Template principal de configuraçãoparsers.conf
: Definições de parsers para diferentes formatos de logentrypoint.sh
: Script de inicialização que processa variáveis de ambiente
Você pode personalizar o comportamento do Fluent Bit modificando os arquivos de configuração ou passando variáveis de ambiente.
O projeto suporta filtragem avançada de logs:
- Filtro por nível de log
- Parsing automático de logs em formato JSON
- Suporte a múltiplos parsers
ATENÇÃO: Este projeto suporta EXCLUSIVAMENTE logs no formato JSON.
{
"date": 1609459200.000,
"level": "info",
"msg": "Mensagem de log",
"user_id": "123e4567-e89b-12d3-a456-426614174000",
"requestId": "req-123-456-789"
}
- Todos os logs DEVEM ser estruturados em JSON
- Campos como
date
,level
,msg
são esperados - Logs em outros formatos serão descartados
- Recomenda-se uso de bibliotecas de log que suportem JSON
- Não há suporte para logs em texto plano
- Não há conversão automática de outros formatos
- A estrutura JSON deve ser consistente
- Faça um fork do projeto
- Crie sua branch de feature (
git checkout -b feature/nova-feature
) - Commit suas mudanças (
git commit -m 'Adiciona nova feature'
) - Push para a branch (
git push origin feature/nova-feature
) - Abra um Pull Request
MIT License - Veja o arquivo LICENSE para detalhes completos.
Reporte problemas através do GitHub Issues. Contribuições são bem-vindas!
Bruno Tulio - [Seu Email ou Perfil GitHub]
A solução utiliza uma tabela PostgreSQL com campos flexíveis para capturar informações de logs:
Coluna | Tipo | Descrição |
---|---|---|
math |
varchar(50) |
Identificador matemático único |
ts |
timestamptz |
Timestamp do log original |
data |
jsonb |
Dados processados do log |
level |
varchar(10) |
Nível do log extraído |
msg |
text |
Mensagem de log extraída |
user_id |
varchar(36) |
ID do usuário extraído |
request_id |
text |
ID da requisição extraído |
CREATE OR REPLACE FUNCTION public.process_log_data()
RETURNS TRIGGER LANGUAGE plpgsql AS $$
BEGIN
IF NEW.data IS NOT NULL THEN
DECLARE
data_jsonb jsonb;
BEGIN
data_jsonb := NEW.data;
-- Extrai campos do JSON
NEW.ts := to_timestamp((data_jsonb->>'date')::float);
NEW.level := data_jsonb->>'level';
NEW.msg := data_jsonb->>'msg';
NEW.user_id := data_jsonb->>'user_id';
NEW.request_id := data_jsonb->>'requestId';
END;
END IF;
RETURN NEW;
END;
$$;
CREATE TRIGGER before_insert_log
BEFORE INSERT ON public.logs
FOR EACH ROW
EXECUTE FUNCTION process_log_data();
- A função
process_log_data()
é executada automaticamente antes de cada inserção - Extrai campos específicos do JSON original
- Popula colunas adicionais de forma dinâmica
- Converte timestamps e outros campos conforme necessário
Benefícios:
- Processamento automático de logs
- Flexibilidade na extração de dados
- Mínima intervenção manual
Sistema de logs de aplicação web:
- Registra eventos de autenticação
- Captura informações de requisições
- Facilita auditoria e monitoramento
Happy Logging! 🚀📊