Dalam komentar untuk tutorial saya tentang parsing log dengan Fluent-bit, dua alternatif diberikan: Filebeat dan Vector . Tutorial ini akan menunjukkan kepada Anda bagaimana mengatur pengumpulan dan penguraian pesan log menggunakan Filebeat.
Tujuan dari tutorial: Untuk mengatur pengumpulan dan penguraian pesan log menggunakan Filebeat.
Penafian: Tutorial tidak berisi solusi siap produksi, tutorial ini ditulis untuk membantu mereka yang baru mulai memahami filebeat dan untuk mengkonsolidasikan materi yang dipelajari oleh penulis. Selain itu, tutorial tidak membandingkan penyedia log. Perbandingan dapat ditemukan di sini .
Siapa yang tertarik dengan topik ini, mohon di bawah :)
Kami akan menjalankan aplikasi pengujian menggunakan docker-compose .
informasi Umum
Filebeat adalah penyedia pesan log ringan. Prinsip operasinya adalah untuk memantau dan mengumpulkan log pesan dari file log dan mengirimkannya ke elasticsearch atau logstash untuk mengindeks.
Filebeat terdiri dari komponen utama:
- kolektor ( Pemanen ) - bertanggung jawab untuk membaca file log dan mengirim pesan log ke antarmuka keluaran yang ditentukan, setiap file log diberikan kolektor terpisah;
- antarmuka input ( input ) - bertanggung jawab atas sumber pesan log pencarian dan kontrol kolektor.
Anda dapat membaca lebih lanjut tentang cara kerjanya di panduan resmi .
Organisasi kumpulan pesan log
Filebeat memiliki berbagai antarmuka masukan untuk berbagai sumber pesan log. Sebagai bagian dari tutorial, saya mengusulkan untuk beralih dari menyiapkan koleksi secara manual ke secara otomatis mencari sumber pesan log dalam wadah. Menurut pendapat saya, pendekatan ini akan memungkinkan pemahaman yang lebih dalam tentang pemukulan file, dan selain itu, saya sendiri bergerak dengan cara yang sama.
, - .
, 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"
Kami struktur pesan bidang pesan log menggunakan membedah handler dan menghapusnya menggunakan 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
Sekarang pesan log terlihat seperti ini:
{ "@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" }
Tambahan
Filebeat juga memiliki solusi out-of-the-box untuk mengumpulkan dan mem-parsing pesan log untuk alat yang banyak digunakan seperti Nginx, Postgres, dll.
Mereka disebut modul .
Misalnya, untuk mengumpulkan pesan log Nginx, cukup tambahkan label ke penampungnya:
co.elastic.logs/module: "nginx"
dan menyertakan petunjuk di file konfigurasi. Setelah itu, kita akan mendapatkan solusi siap pakai untuk mengumpulkan dan mengurai pesan log + dasbor yang nyaman di Kibana.
Terima kasih atas perhatiannya!