Análise de Logs do Sistema com BERT para Identificar Consumo Anômalo de Disco

A indicação de espaço insuficiente na unidade principal do sistema operacional frequentemente aponta para problemas subjacentes que vão além de arquivos temporários acumulados. Ferramentas convencionais de limpeza oferecem alívio momentâneo, mas falham em mitigar a causa raiz: processos ou serviços que geram volumes massivos de dados de forma contínua. As evidências dessas operações residem nos logs do sistema.

Limitações das Abordagens Tradicionais de Aálise

Arquivos de log do Windows e de aplicações (localizados em diretórios como C:\Windows\Logs ou AppData\Local) armazenam registros cruciais sobre falhas de atualização, expansões repentinas de cache e gravações intensivas. No entanto, a natureza não estruturada e contínua desses textos dificulta a inspeção manual.

O uso de expressões regulares ou comanods como grep para buscar termos como "error" ou "failed" apresenta limitações severas:

  • Falsos Negativos: Operações que consomem espaço nem sempre geram códigos de erro; muitas vezes são registradas como eventos normais.
  • Ruído Excessivo: Consultas genéricas retornam milhares de ocorrências irrelevantes.
  • Perda de Contexto: Linhas isoladas não fornecem a sequência de eventos que levou ao problema.

A solução requer a extração inteligente de blocos de texto que descrevam semanticamente alterações no armazenamento, tarefa na qual modelos de Processamento de Linguagem Natural (PLN) como o BERT demonstram alta eficácia.

Semântica Aplicada à Detecção de Eventos

A aplicação do BERT na análise de infraestrutura foca na capacidade do modelo de identificar se um parágrafo descreve operações de "escrita", "exclusão", "cache" ou "espaço insuficiente". Em vez de buscar correspondências exatas de strings, o modelo agrupa sentenças consecutivas que, em conjunto, narram um evento de anomalia de disco.

Considere o seguinte trecho de log de instalação:

2023-11-05 09:10:12 INFO Initializing deployment for ServiceX.
2023-11-05 09:10:15 INFO Environment validation successful.
2023-11-05 09:10:20 INFO Extracting payload to C:\Temp\ServiceX_Build.
2023-11-05 09:11:45 INFO Extraction complete. Payload size: 3.4 GB.
2023-11-05 09:12:00 INFO Moving binaries to target directory.
2023-11-05 09:13:30 INFO Deployment finalized.
2023-11-05 09:14:00 INFO Initiating cleanup routine for C:\Temp\ServiceX_Build.
2023-11-05 09:14:05 ERROR Cleanup aborted. Handle locked by background process. Directory retained.

Um analista humano identifica imediatamente que a falha na rotina de limpeza resultou na retenção de 3.4 GB. O objetivo é automatizar essa dedução, permitindo que o modelo extraia o contexto completo da falha para auditoria.

Implementação da Pipeline de Análise

O fluxo de trabalho compreende a agregação dos dados, o processamento semântico via transformers e a filtragem dos resultados.

Agregação e Pré-processamento de Logs

O primeiro passo envolve a consolidação de arquivos de texto espalhados pelo sistema. O script abaixo utiliza a biblioteca pathlib para iterar pelos diretórios e aplicar rotinas de normalização.

import re
from pathlib import Path

def aggregate_system_logs(directories: list[str]) -> str:
    """
    Consolida arquivos de log de múltiplos diretórios e aplica sanitização básica.
    """
    consolidated_data = []
    
    for target_dir in directories:
        dir_path = Path(target_dir)
        if not dir_path.is_dir():
            print(f"Diretório ignorado (inexistente): {target_dir}")
            continue
            
        # Busca recursiva por arquivos .log e .txt
        for log_file in dir_path.rglob('*'):
            if log_file.suffix in ['.log', '.txt']:
                try:
                    content = log_file.read_text(encoding='utf-8', errors='ignore')
                    # Normalização: remove múltiplas quebras de linha e espaços excessivos
                    sanitized = re.sub(r'\n{2,}', '\n', content)
                    sanitized = re.sub(r'[ \t]+', ' ', sanitized)
                    consolidated_data.append(f"\n[SOURCE: {log_file}]\n{sanitized}")
                except Exception as err:
                    print(f"Falha ao processar {log_file}: {err}")
                    
    return "\n".join(consolidated_data)

# Definição dos caminhos alvo no Windows
paths_to_scan = [
    'C:/Windows/Logs',
    'C:/ProgramData/Microsoft/Windows/WER',
]
raw_log_data = aggregate_system_logs(paths_to_scan)
print(f"Volume total de caracteres processados: {len(raw_log_data)}")

Segmentação e Classificação Semântica com Transformers

Para evitar o custo computacional do treinamento do zero, utilizamos modelos pré-treinados através da biblioteca sentence-transformers. A estratégia baseia-se na busca semântica (semantic search), comparando a representação vetorial dos segmentos de log com um conjunto de consultas predefinidas que descrevem anomalias de armazenamento.

import re
import torch
import numpy as np
from sentence_transformers import SentenceTransformer, util

def detect_storage_anomalies(log_corpus: str, search_queries: list[str], model_id: str = 'paraphrase-multilingual-MiniLM-L12-v2', limit: int = 10):
    """
    Segmenta o corpus e ranqueia os trechos com base na similaridade semântica com as consultas.
    """
    # Inicialização do modelo de embeddings
    embedder = SentenceTransformer(model_id)
    
    # Segmentação baseada em delimitadores de parágrafo ou fonte
    # Filtragem de blocos muito curtos que carecem de contexto
    segments = [block.strip() for block in re.split(r'\n\[SOURCE:|\n{2,}', log_corpus) if len(block.strip()) > 50]
    print(f"Corpus dividido em {len(segments)} segmentos analíticos.")
    
    # Geração de tensores de embeddings
    corpus_embeddings = embedder.encode(segments, convert_to_tensor=True)
    query_embeddings = embedder.encode(search_queries, convert_to_tensor=True)
    
    # Cálculo da matriz de similaridade de cosseno
    similarity_matrix = util.cos_sim(corpus_embeddings, query_embeddings)
    
    # Extração da maior pontuação de similaridade para cada segmento em relação a qualquer query
    peak_scores, _ = torch.max(similarity_matrix, dim=1)
    
    # Ordenação dos índices baseada nas pontuações (decrescente)
    ranked_indices = np.argsort(-peak_scores.cpu().numpy())[:limit]
    
    # Compilação dos resultados com janela de contexto
    anomaly_reports = []
    for rank in ranked_indices:
        # Recuperação de contexto adjacente (se disponível)
        start = max(0, rank - 1)
        end = min(len(segments), rank + 2)
        contextual_window = " [...] ".join(segments[start:end])
        
        anomaly_reports.append({
            'confidence': peak_scores[rank].item(),
            'primary_segment': segments[rank],
            'context_window': contextual_window
        })
        
    return anomaly_reports

# Queries focadas em falhas de gerenciamento de espaço em disco
diagnostic_queries = [
    "falha ao excluir diretório temporário",
    "espaço em disco insuficiente para gravação",
    "arquivo de log excedeu o limite de rotação",
    "cache de aplicação cresceu descontroladamente",
    "processo de limpeza pós-instalação abortado",
    "arquivo de dump de memória gerado por crash"
]

# Execução do motor de detecção
identified_issues = detect_storage_anomalies(raw_log_data, diagnostic_queries, limit=10)

print("\n--- Relatório de Anomalias de Armazenamento ---")
for idx, issue in enumerate(identified_issues):
    print(f"\n[Ocorrência {idx+1}] Nível de Confiança: {issue['confidence']:.4f}")
    print(f"Trecho Principal: {issue['primary_segment'][:150]}...")
    print(f"Contexto: {issue['context_window'][:250]}...")

Interpretação dos Resultados

A saída do algoritmo fornece uma lista priorizada de eventos suspeitos. Trechos com alta pontuação de confiança indicam forte correlação semântica com problemas de esgotamento de disco. Por exemplo, um relatório pode destacar:

[Ocorrência 1] Nível de Confiança: 0.891
Trecho Principal: ERROR Cleanup aborted. Handle locked by background process. Directory retained.
Contexto: [...] INFO Deployment finalized. ERROR Cleanup aborted. Handle locked by background process. Directory retained. Payload size: 3.4 GB. [...]

Este dado direciona a ação corretiva imediata: investigar o processo que mantém o bloqueio (handle) no diretório temporário e forçar a liberação do recurso, recuperando o espaço alocado.

Otimizações para Ambientes de Produção

Para maximizar a precisão e a eficiência da pipeline em cenários reais, considere as seguintes adaptações:

  • Expansão do Léxico de Consultas: Construa um repositório robusto de queries baseado em incidentes históricos. Inclua variações em múltiplos idiomas e termos específicos de fornecedores de software.
  • Granularidade de Segmentação: Para logs estruturados, implemente divisores baseados em expressões regulares que capturem padrões de carimbo de data/hora (timestamp), garantindo que eventos atômicos não sejam fraturados.
  • Filtragem Híbrida: Combine a análise semântica com filtros heurísticos prévios. Descarte blocos que não contenham métricas de volume (ex: "MB", "GB", "bytes") para reduzir a carga de inferência do modelo.
  • Automação Contínua: Integre o script a agendadores de tarefas nativos (como o Task Scheduler do Windows ou cron no Linux) para gerar relatórios diários de saúde do armazenamento.
  • Fine-tuning Específico: Em organizações com grandes volumes de logs rotulados, o ajuste fino (fine-tuning) de modelos como o BERT para o domínio de infraestrutura de TI aumentará drasticamente a taxa de recall de anomalias sutis.

Tags: BERT Python Sentence-Transformers Análise de Logs PLN

Publicado em 7-1 01:38