Organisation de la collecte et de l'analyse des journaux à l'aide de Filebeat

Dans les commentaires de mon tutoriel sur l'analyse des journaux avec Fluent-bit, deux alternatives ont été proposées: Filebeat et Vector . Ce didacticiel va vous montrer comment organiser la collecte et l'analyse des messages de journal à l'aide de Filebeat.







Le but du didacticiel: organiser la collecte et l'analyse des messages de journal à l'aide de Filebeat.







Avertissement: Le didacticiel ne contient pas de solutions prêtes pour la production, il a été écrit pour aider ceux qui commencent tout juste à comprendre filebeat et à consolider le matériel étudié par l'auteur. De plus, le didacticiel ne compare pas les fournisseurs de journaux. Une comparaison peut être trouvée ici .







Qui est intéressé par ce sujet, s'il vous plaît sous la coupe :)







Nous exécuterons l'application de test en utilisant docker-compose .







informations générales



Filebeat est un fournisseur de messages de journal léger. Son principe de fonctionnement est de surveiller et d' enregistrer des fichiers de récupérer les messages journaux et les envoyer à ElasticSearch ou logstash pour l' indexation.







Filebeat se compose de composants clés:







  • collectors ( Harvesters ) - responsables de la lecture des fichiers journaux et de l'envoi des messages de journal à l'interface de sortie spécifiée, chaque fichier journal reçoit un collecteur distinct;
  • interfaces d'entrée ( entrées le ) - sont responsables des sources de messages du journal de recherche et du contrôle des collecteurs.


Vous pouvez en savoir plus sur son fonctionnement dans le guide officiel .







Organisation de la collecte des messages de journal



Filebeat a une variété d' interfaces d'entrée pour différentes sources de messages de journal. Dans le cadre du tutoriel, je propose de passer de la configuration manuelle de la collecte à la recherche automatique des sources des messages de journal dans les conteneurs. À mon avis, cette approche permettra une compréhension plus profonde de filebeat, et d'ailleurs, j'ai moi-même évolué de la même manière.







, - .

, 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. Nous structurons le champ de message du message de journal à l'aide du gestionnaire de dissection et le supprimons à l' aide de 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
          
          





    Maintenant, le message du journal ressemble à ceci:







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







Une addition



Filebeat propose également des solutions prêtes à l'emploi pour collecter et analyser les messages de journal pour des outils largement utilisés tels que Nginx, Postgres, etc.







Ils sont appelés modules .







Par exemple, pour collecter les messages du journal Nginx, ajoutez simplement une étiquette à son conteneur:







  co.elastic.logs/module: "nginx"
      
      





et incluez des astuces dans le fichier de configuration. Après cela, nous aurons une solution toute faite pour collecter et analyser les messages de journal + un tableau de bord pratique dans Kibana.







Merci à tous pour votre attention!








All Articles