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 :
- - :
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"
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!