Sobes.tech
Middle+

Como você organizaria o registro apenas para aplicativos específicos usando a pilha EFK?

sobes.tech IA

Resposta da IA

Para registar certas aplicações na pilha EFK (Elasticsearch, Fluentd, Kibana), seguiria estes passos:

  1. Configurar Fluentd nos servidores fonte. Em cada servidor onde as aplicações alvo estão em execução, instala e configura o agente Fluentd (ou td-agent). Na configuração do Fluentd (td-agent.conf ou similar), definem-se as fontes (sources) e filtros (filters) para recolher os logs.

    # source - recolhe logs de ficheiros
    <source>
      @type tail
      # Caminho para os logs da aplicação específica
      path /var/log/myapp/*.log
      # Formato dos logs (necessário para o parsing)
      pos_file /var/log/td-agent/myapp.log.pos
      tag app.myapp.log # Tag única para esta aplicação
      <parse>
        @type regexp
        expression /^(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) \[(?<level>\w+)\] (?<message>.+)$/
        time_format %Y-%m-%d %H:%M:%S
      </parse>
    </source>
    
    # Pode adicionar tantas fontes quanto necessário
    <source>
      @type tail
      path /var/log/other_app/app.log
      pos_file /var/log/td-agent/other_app.log.pos
      tag app.otherapp.log
      <parse>
        @type json # Ou outro formato, dependendo da aplicação
      </parse>
    </source>
    
    # filter - enriquecimento ou filtragem de dados (opcional)
    <filter app.*> # Aplica-se a todas as tags que começam com 'app.'
      @type record_transformer
      <record>
        hostname "#{Socket.gethostname}" # Adiciona o nome do host
        env "production" # Ou outro ambiente
      </record>
    </filter>
    
    # match - envia os dados para Elasticsearch
    <match app.*> # Envia apenas os dados das aplicações Elasticsearch
      @type elasticsearch
      host elasticsearch.host.name # Endereço do seu Elasticsearch
      port 9200
      logstash_format true # Compatibilidade com o formato Logstash
      logstash_prefix myapps # O índice no Elasticsearch será myapps-YYYY.MM.DD
      include_tag_key true
      tag_key @log_name # Guardar a tag no campo @log_name para filtragem no Kibana
      <buffer>
        @type file
        path /var/log/td-agent/buffer/elasticsearch
        chunk_limit_size 10m
        queue_limit_length 100
        flush_interval 1m
      </buffer>
    </match>
    
  2. Configuração do Elasticsearch. O Elasticsearch criará automaticamente índices com o prefixo myapps-* (ou o que estiver definido em logstash_prefix) com base nos dados recebidos do Fluentd. Não são necessárias configurações especiais para filtrar dados de aplicações no Elasticsearch, o Elasticsearch apenas armazena os dados recebidos nos índices.

  3. Configurar o Kibana. No Kibana, cria-se um padrão de índice (Index Pattern) correspondente ao prefixo do índice no Elasticsearch, por exemplo, myapps-*. Após criar o padrão de índice:

    • Na aba "Discover" é possível filtrar os dados pelo campo @log_name (se foi adicionado na configuração do Fluentd) ou por outros campos que identificam a aplicação (por exemplo, hostname, se a aplicação for única no host, ou adicionar um campo app_name através do record_transformer).
    • Para criar dashboards e visualizações, pode-se usar KQL ou sintaxe Lucene para filtrar os dados pelos mesmos campos.

Exemplos de filtros no Kibana:

@log_name : "app.myapp.log"  // Mostra apenas os logs da aplicação myapp
@log_name : "app.*" AND level : "ERROR" // Erros de todas as aplicações registadas via 'app.*'

Assim, a chave para organizar o registo apenas para aplicações específicas é:

  • Usar caminhos específicos para os ficheiros de logs nas secções source do Fluentd.
  • Atribuir tags únicas (tag) aos logs de cada aplicação no Fluentd.
  • Usar essas tags (ou campos adicionados com base nas tags) para filtrar no Kibana.
  • Restringir o envio de dados ao Elasticsearch apenas para as tags necessárias usando a secção match.