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