Organizando a coleta e análise de logs usando o Filebeat

Nos comentários do meu tutorial sobre análise de logs com Fluent-bit, duas alternativas foram fornecidas: Filebeat e Vector . Este tutorial mostrará como organizar a coleta e análise de mensagens de log usando o Filebeat.







O objetivo do tutorial: Organizar a coleta e análise de mensagens de log usando o Filebeat.







Aviso Legal: O tutorial não contém soluções prontas para produção, ele foi escrito para ajudar aqueles que estão apenas começando a entender o filebeat e para consolidar o material estudado pelo autor. Além disso, o tutorial não compara provedores de log. Uma comparação pode ser encontrada aqui .







Quem estiver interessado neste tópico, por favor, sob o recorte :)







Executaremos o aplicativo de teste usando docker-compose .







informações gerais



Filebeat é um provedor de mensagens de log leve. Seu princípio de funcionamento é monitorar e coletar mensagens de log de arquivos de log e enviá-los para ElasticSearch ou logstash para indexação.







O Filebeat consiste em componentes principais:







  • coletores ( Harvesters ) - responsáveis ​​por ler os arquivos de log e enviar mensagens de log para a interface de saída especificada, cada arquivo de log recebe um coletor separado;
  • interfaces de entrada ( entradas ) - são responsáveis ​​pelo controle das fontes e dos coletores das mensagens do log de pesquisa.


Você pode ler mais sobre como funciona no guia oficial .







Organização da coleção de mensagens de log



O Filebeat possui uma variedade de interfaces de entrada para diferentes fontes de mensagens de log. Como parte do tutorial, proponho passar da configuração manual da coleção para a busca automática de fontes de mensagens de log em contêineres. Em minha opinião, essa abordagem permitirá um entendimento mais profundo do filebeat e, além disso, eu mesmo agi da mesma forma.







, - .

, FastAPI, -.







- volume



. , Filebeat docker-compose.yml.

- volume :







  1. - :



    app/api/main.py







    logger.add(
        "./logs/file.log",
        format="app-log - {level} - {message}",
        rotation="500 MB"
    )
          
          



  2. volume - :

    docker-compose.yml









    version: "3.8"
    
    services:
      app:
        ...
        volumes:
          #  volume,   -  
          - app-logs:/logs
    
      log-shipper:
        ...
        volumes:
          #     
          - ./filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro
          #  volume  -  
          - app-logs:/var/app/log
    
    volumes:
      app-logs:
          
          





  3. filebeat:

    filebeat.docker.yml









    filebeat.inputs:
    - type: log
      #    -
      paths:
        - /var/app/log/*.log
    
    #    -  
    output.console:
      pretty: true
          
          





    , - :







    {
    "@timestamp": "2021-04-01T04:02:28.138Z",
    "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.12.0"
    },
    "ecs": {
    "version": "1.8.0"
    },
    "host": {
    "name": "aa9718a27eb9"
    },
    "message": "app-log - ERROR - [Item not found] - 1",
    "log": {
    "offset": 377,
    "file": {
      "path": "/var/app/log/file.log"
    }
    },
    "input": {
    "type": "log"
    },
    "agent": {
    "version": "7.12.0",
    "hostname": "aa9718a27eb9",
    "ephemeral_id": "df245ed5-bd04-4eca-8b89-bd0c61169283",
    "id": "35333344-c3cc-44bf-a4d6-3a7315c328eb",
    "name": "aa9718a27eb9",
    "type": "filebeat"
    }
    }
          
          







- container



ontainer - - .

- container :







  1. log, , .
  2. container :

    filebeat.docker.yml









    filebeat.inputs:
    - type: container
      #   - 
      paths:
        - '/var/lib/docker/containers/*/*.log'
    
    #    -  
    output.console:
      pretty: true
          
          





  3. volume app-logs app log-shipper , .
  4. log-shipper - :

    docker-compose.yml









    version: "3.8"
    
    services:
      app:
        ...
    
      log-shipper:
        ...
        volumes:
          #     
          - ./filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro
          - /var/lib/docker/containers:/var/lib/docker/containers:ro
          - /var/run/docker.sock:/var/run/docker.sock:ro
          
          





  5. - :

    app/api/main.py





    logger.add(
        sys.stdout,
        format="app-log - {level} - {message}",
    )
          
          





container, , - , - .

.







-



- , , , .. filebeat , - . :







  • ;
  • -.


.







:







  1. container, , .
  2. :

    filebeat.docker.yml









    filebeat.autodiscover:
      providers:
        #  docker 
        - type: docker
          templates:
            - condition:
                contains:
                  #   fastapi_app
                  docker.container.name: fastapi_app
              #      
              config:
                - type: container
                  paths:
                    - /var/lib/docker/containers/${data.docker.container.id}/*.log
                  #  - asgi-
                  exclude_lines: ["^INFO:"]
    
    #    -  
    output.console:
      pretty: true
          
          







. filebeat - .







- (hints)



Filebeat .

() .

, Filebeat , - , .







.







:







  1. app :

    filebeat.docker.yml









    filebeat.autodiscover:
      providers:
        - type: docker
          hints.enabled: true
    
    #    -  
    output.console:
      pretty: true
          
          





  2. - log-shipper:

    docker-compose.yml









    version: "3.8"
    
    services:
      app:
        ...
    
      log-shipper:
        ...
        labels:
          co.elastic.logs/enabled: "false"
          
          







-



- Filebeat (processors).

.

.







  1. - . drop_fields:

    filebeat.docker.yml









    processors:
      - drop_fields:
          fields: ["agent", "container", "ecs", "log", "input", "docker", "host"]
          ignore_missing: true
          
          





    - :







    {
      "@timestamp": "2021-04-01T04:02:28.138Z",
      "@metadata": {
        "beat": "filebeat",
        "type": "_doc",
        "version": "7.12.0"
      },
      "message": "app-log - ERROR - [Item not found] - 1",
      "stream": ["stdout"]
    }
          
          





  2. - API - asgi-, add_tags:

    filebeat.docker.yml









    processors:
      - drop_fields:
          ...
      - add_tags:
        when:
          contains:
            "message": "app-log"
        tags: [test-app]
        target: "environment"
          
          





  3. Estruturamos o campo de mensagem da mensagem de log usando o manipulador de dissecção e o removemos usando drop_fields :

    filebeat.docker.yml









    processors:
      - drop_fields:
        ...
      - add_tags:
        ...
     - dissect:
         when:
           contains:
             "message": "app-log"
         tokenizer: 'app-log - %{log-level} - [%{event.name}] - %{event.message}'
         field: "message"
         target_prefix: ""
     - drop_fields:
         when:
           contains:
             "message": "app-log"
         fields: ["message"]
         ignore_missing: true
          
          





    Agora, a mensagem de registro é semelhante a esta:







    {
      "@timestamp": "2021-04-02T08:29:07.349Z",
      "@metadata": {
        "beat": "filebeat",
        "type": "_doc",
        "version": "7.12.0"
      },
      "log-level": "ERROR",
      "event": {
        "name": "Item not found",
        "message": "Foo"
      },
      "environment": [
        "test-app"
      ],
      "stream": "stdout"
    }
          
          







Adição



O Filebeat também oferece soluções prontas para a coleta e análise de mensagens de log para ferramentas amplamente utilizadas, como Nginx, Postgres, etc.







Eles são chamados de módulos .







Por exemplo, para coletar mensagens de registro Nginx, basta adicionar um rótulo ao seu contêiner:







  co.elastic.logs/module: "nginx"
      
      





e incluir dicas no arquivo de configuração. Depois disso, obteremos uma solução pronta para coletar e analisar mensagens de log + um painel conveniente em Kibana.







Obrigado a todos pela atenção!








All Articles