Fluent-bitを使用したログの解析に関するチュートリアルへのコメントでは、FilebeatとVectorの2つの選択肢が示されています。このチュートリアルでは、Filebeatを使用してログメッセージの収集と解析を整理する方法を説明します。
チュートリアルの目的: Filebeatを使用してログメッセージの収集と解析を整理すること。
免責事項:チュートリアルには、本番環境に対応したソリューションは含まれていません。ファイルビートを理解し始めたばかりの人を支援し、作成者が調査した資料を統合するために作成されました。また、チュートリアルではログプロバイダーを比較していません。比較はここにあります。
docker-composeを使用してテストアプリケーションを実行します。
一般情報
Filebeatは、軽量のログメッセージプロバイダーです。操作のその原理を監視し、収集ログメッセージをログファイルからとし、それらを送信することですelasticsearchまたはlogstashインデックスを作成。
Filebeatは、主要なコンポーネントで構成されています。
- コレクター(ハーベスター)-ログファイルの読み取りと指定された出力インターフェイスへのログメッセージの送信を担当し、各ログファイルには個別のコレクターが割り当てられます。
- 入力インターフェイス(入力)-ソースとコレクターが制御する検索ログメッセージを担当します。
それがどのように機能するかについての詳細は、公式ガイドで読むことができます。
ログメッセージの収集の編成
Filebeatには、ログメッセージのさまざまなソース用のさまざまな入力インターフェイスがあります。チュートリアルの一環として、コレクションを手動で設定することから、コンテナー内のログメッセージのソースを自動的に検索することへと移行することを提案します。私の意見では、このアプローチはファイルビートのより深い理解を可能にするでしょう、そしてその上、私自身も同じように動きました。
, - .
, 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"
私たちは、構造化メッセージのフィールド使用して、ログメッセージを解剖ハンドラをして使用して削除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
これで、ログメッセージは次のようになります。
{ "@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" }
添加
Filebeatには、Nginx、Postgresなどの広く使用されているツールのログメッセージを収集および解析するためのすぐに使用できるソリューションもあります。
たとえば、Nginxログメッセージを収集するには、コンテナにラベルを追加するだけです。
co.elastic.logs/module: "nginx"
設定ファイルにヒントを含めます。その後、ログメッセージを収集および解析するための既製のソリューションとKibanaの便利なダッシュボードを取得します。
ご清聴ありがとうございました!