Nos comentários do meu tutorial sobre análise de logs com Fluent-bit, duas alternativas foram fornecidas: Filebeat e Vector . Este tutorial mostrará como organizar a coleta e análise de mensagens de log usando o Filebeat.
O objetivo do tutorial: Organizar a coleta e análise de mensagens de log usando o Filebeat.
Aviso Legal: O tutorial não contém soluções prontas para produção, ele foi escrito para ajudar aqueles que estão apenas começando a entender o filebeat e para consolidar o material estudado pelo autor. Além disso, o tutorial não compara provedores de log. Uma comparação pode ser encontrada aqui .
Quem estiver interessado neste tópico, por favor, sob o recorte :)
Executaremos o aplicativo de teste usando docker-compose .
informações gerais
Filebeat é um provedor de mensagens de log leve. Seu princípio de funcionamento é monitorar e coletar mensagens de log de arquivos de log e enviá-los para ElasticSearch ou logstash para indexação.
O Filebeat consiste em componentes principais:
- coletores ( Harvesters ) - responsáveis por ler os arquivos de log e enviar mensagens de log para a interface de saída especificada, cada arquivo de log recebe um coletor separado;
- interfaces de entrada ( entradas ) - são responsáveis pelo controle das fontes e dos coletores das mensagens do log de pesquisa.
Você pode ler mais sobre como funciona no guia oficial .
Organização da coleção de mensagens de log
O Filebeat possui uma variedade de interfaces de entrada para diferentes fontes de mensagens de log. Como parte do tutorial, proponho passar da configuração manual da coleção para a busca automática de fontes de mensagens de log em contêineres. Em minha opinião, essa abordagem permitirá um entendimento mais profundo do filebeat e, além disso, eu mesmo agi da mesma forma.
, - .
, 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"
Estruturamos o campo de mensagem da mensagem de log usando o manipulador de dissecção e o removemos 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
Agora, a mensagem de registro é semelhante a esta:
{ "@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" }
Adição
O Filebeat também oferece soluções prontas para a coleta e análise de mensagens de log para ferramentas amplamente utilizadas, como Nginx, Postgres, etc.
Eles são chamados de módulos .
Por exemplo, para coletar mensagens de registro Nginx, basta adicionar um rótulo ao seu contêiner:
co.elastic.logs/module: "nginx"
e incluir dicas no arquivo de configuração. Depois disso, obteremos uma solução pronta para coletar e analisar mensagens de log + um painel conveniente em Kibana.
Obrigado a todos pela atenção!