Organizar la recopilación y el análisis de registros con Filebeat

En los comentarios a mi tutorial sobre el análisis de registros con Fluent-bit, se dieron dos alternativas: Filebeat y Vector . Este tutorial le mostrará cómo organizar la recopilación y el análisis de mensajes de registro utilizando Filebeat.







El propósito del tutorial: Organizar la recopilación y el análisis de mensajes de registro usando Filebeat.







Descargo de responsabilidad: el tutorial no contiene soluciones listas para producción, fue escrito para ayudar a aquellos que recién están comenzando a comprender filebeat y consolidar el material estudiado por el autor. Además, el tutorial no compara proveedores de registros. Puede encontrar una comparación aquí .







Quién está interesado en este tema, por favor debajo del corte :)







Ejecutaremos la aplicación de prueba usando docker-compose .







información general



Filebeat es un proveedor de mensajes de registro ligero. Su principio de funcionamiento consiste en supervisar y recoger los mensajes de registro de archivos de registro y enviarlos a Elasticsearch o logstash para la indexación.







Filebeat consta de componentes clave:







  • recopiladores ( recolectores ): responsables de leer los archivos de registro y enviar mensajes de registro a la interfaz de salida especificada, a cada archivo de registro se le asigna un recopilador separado;
  • interfaces de entrada ( entradas el ) - son responsables del control de fuentes de mensajes de registro de búsqueda y recopiladores.


Puedes leer más sobre cómo funciona en la guía oficial .







Organización de la recopilación de mensajes de registro



Filebeat tiene una variedad de interfaces de entrada para diferentes fuentes de mensajes de registro. Como parte del tutorial, propongo pasar de configurar la recopilación manualmente a buscar automáticamente las fuentes de los mensajes de registro en los contenedores. En mi opinión, este enfoque permitirá una comprensión más profunda de filebeat y, además, yo mismo me moví de la misma manera.







, - .

, 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. Estructuramos el campo de mensaje del mensaje de registro usando el controlador de disección y lo eliminamos 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
          
          





    Ahora el mensaje de registro se ve así:







    {
      "@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"
    }
          
          







Adición



Filebeat también tiene soluciones listas para usar para recopilar y analizar mensajes de registro para herramientas ampliamente utilizadas como Nginx, Postgres, etc.







Se llaman módulos .







Por ejemplo, para recopilar mensajes de registro de Nginx, simplemente agregue una etiqueta a su contenedor:







  co.elastic.logs/module: "nginx"
      
      





e incluir sugerencias en el archivo de configuración. Después de eso, obtendremos una solución preparada para recopilar y analizar mensajes de registro + un panel conveniente en Kibana.







¡Gracias a todos por su atención!








All Articles