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 :
- - :
app/api/main.py
logger.add( "./logs/file.log", format="app-log - {level} - {message}", rotation="500 MB" )
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:
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 :
- log, , .
container :
filebeat.docker.yml
filebeat.inputs: - type: container # - paths: - '/var/lib/docker/containers/*/*.log' # - output.console: pretty: true
- volume app-logs app log-shipper , .
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
- - :
app/api/main.py
logger.add( sys.stdout, format="app-log - {level} - {message}", )
container, , - , - .
.
-
- , , , .. filebeat , - . :
- ;
- -.
:
- container, , .
:
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 , - , .
:
app :
filebeat.docker.yml
filebeat.autodiscover: providers: - type: docker hints.enabled: true # - output.console: pretty: true
- log-shipper:
docker-compose.yml
version: "3.8" services: app: ... log-shipper: ... labels: co.elastic.logs/enabled: "false"
-
- Filebeat (processors).
.
.
- . 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"] }
- API - asgi-, add_tags:
filebeat.docker.yml
processors: - drop_fields: ... - add_tags: when: contains: "message": "app-log" tags: [test-app] target: "environment"
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!