Organisieren der Erfassung und Analyse von Protokollen mithilfe von Filebeat

In den Kommentaren zu meinem Tutorial zum Parsen von Protokollen mit Fluent-Bit wurden zwei Alternativen angegeben: Filebeat und Vector . Dieses Tutorial zeigt Ihnen, wie Sie das Sammeln und Parsen von Protokollnachrichten mithilfe von Filebeat organisieren.







Der Zweck des Tutorials: Organisieren der Erfassung und Analyse von Protokollnachrichten mithilfe von Filebeat.







Haftungsausschluss: Das Tutorial enthält keine produktionsfertigen Lösungen. Es wurde geschrieben, um denjenigen zu helfen, die gerade erst anfangen, Filebeat zu verstehen, und um das vom Autor untersuchte Material zu konsolidieren. Außerdem werden im Lernprogramm keine Protokollanbieter verglichen. Einen Vergleich finden Sie hier .







Wer sich für dieses Thema interessiert, bitte unter den Schnitt :)







Wir werden die Testanwendung mit Docker-Compose ausführen .







allgemeine Informationen



Filebeat ist ein kompakter Anbieter von Protokollnachrichten. Sein Funktionsprinzip ist zu überwachen und collect Log - Meldungen aus den Log - Dateien und senden Sie sie an Elasticsearch oder logstash für die Indizierung.







Filebeat besteht aus Schlüsselkomponenten:







  • Collectors ( Harvesters ) - Jede Protokolldatei erhält einen separaten Collector, der für das Lesen der Protokolldateien und das Senden von Protokollnachrichten an die angegebene Ausgabeschnittstelle verantwortlich ist.
  • Eingabeschnittstellen ( Eingaben der ) - sind für die Quellen der Suchprotokollnachrichten und die Steuerung der Kollektoren verantwortlich.


Weitere Informationen zur Funktionsweise finden Sie im offiziellen Handbuch .







Organisation der Sammlung von Protokollnachrichten



Filebeat verfügt über eine Vielzahl von Eingabeschnittstellen für verschiedene Quellen von Protokollnachrichten. Als Teil des Tutorials schlage ich vor, von der manuellen Einrichtung der Sammlung zur automatischen Suche nach Quellen für Protokollnachrichten in Containern überzugehen. Meiner Meinung nach wird dieser Ansatz ein tieferes Verständnis von Filebeat ermöglichen, und außerdem habe ich mich selbst auf die gleiche Weise bewegt.







, - .

, 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. Wir strukturieren das Nachrichtenfeld Log - Nachricht die Verwendung dissect Handler und entfernen Sie sie mit 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
          
          





    Jetzt sieht die Protokollnachricht folgendermaßen aus:







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







Zusatz



Filebeat bietet auch sofort einsatzbereite Lösungen zum Sammeln und Parsen von Protokollnachrichten für weit verbreitete Tools wie Nginx, Postgres usw.







Sie werden Module genannt .







Um beispielsweise Nginx-Protokollnachrichten zu erfassen, fügen Sie dem Container einfach eine Bezeichnung hinzu:







  co.elastic.logs/module: "nginx"
      
      





und fügen Sie Hinweise in die Konfigurationsdatei ein. Danach erhalten wir eine vorgefertigte Lösung zum Sammeln und Parsen von Protokollnachrichten sowie ein praktisches Dashboard in Kibana.







Vielen Dank für Ihre Aufmerksamkeit!








All Articles