Filebeatを使用したログの収集と解析の整理

Fluent-bitを使用したログの解析に関するチュートリアルへのコメントでは、FilebeatVectorの2つの選択肢が示されていますこのチュートリアルでは、Filebeatを使用してログメッセージの収集と解析を整理する方法を説明します。







チュートリアルの目的: Filebeatを使用してログメッセージの収集と解析を整理すること。







免責事項:チュートリアルには、本番環境に対応したソリューションは含まれていません。ファイルビートを理解し始めたばかりの人を支援し、作成者が調査した資料を統合するために作成されました。また、チュートリアルではログプロバイダーを比較していません。比較はここにあります







このトピックに興味のある方は、カットの下にお願いします:)







docker-composeを使用してテストアプリケーションを実行します







一般情報



Filebeatは、軽量のログメッセージプロバイダーです。操作のその原理を監視し、収集ログメッセージをログファイルからとし、それらを送信することですelasticsearchまたはlogstashインデックスを作成。







Filebeatは、主要なコンポーネントで構成されています。







  • コレクター(ハーベスター)-ログファイルの読み取りと指定された出力インターフェイスへのログメッセージの送信を担当し、各ログファイルには個別のコレクターが割り当てられます。
  • 入力インターフェイス(入力)-ソースとコレクターが制御する検索ログメッセージを担当します。


それがどのように機能するかについての詳細は、公式ガイドで読むことができます







ログメッセージの収集の編成



Filebeatには、ログメッセージのさまざまなソース用のさまざまな入力インターフェイスがあります。チュートリアルの一環として、コレクションを手動で設定することから、コンテナー内のログメッセージのソースを自動的に検索することへと移行することを提案します。私の意見では、このアプローチはファイルビートのより深い理解を可能にするでしょう、そしてその上、私自身も同じように動きました。







, - .

, FastAPI, -.







- volume



. , Filebeat docker-compose.yml.

- volume :







  1. - :



    app/api/main.py







    logger.add(
        "./logs/file.log",
        format="app-log - {level} - {message}",
        rotation="500 MB"
    )
          
          



  2. 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:
          
          





  3. 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 :







  1. log, , .
  2. container :

    filebeat.docker.yml









    filebeat.inputs:
    - type: container
      #   - 
      paths:
        - '/var/lib/docker/containers/*/*.log'
    
    #    -  
    output.console:
      pretty: true
          
          





  3. volume app-logs app log-shipper , .
  4. 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
          
          





  5. - :

    app/api/main.py





    logger.add(
        sys.stdout,
        format="app-log - {level} - {message}",
    )
          
          





container, , - , - .

.







-



- , , , .. filebeat , - . :







  • ;
  • -.


.







:







  1. container, , .
  2. :

    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 , - , .







.







:







  1. app :

    filebeat.docker.yml









    filebeat.autodiscover:
      providers:
        - type: docker
          hints.enabled: true
    
    #    -  
    output.console:
      pretty: true
          
          





  2. - log-shipper:

    docker-compose.yml









    version: "3.8"
    
    services:
      app:
        ...
    
      log-shipper:
        ...
        labels:
          co.elastic.logs/enabled: "false"
          
          







-



- Filebeat (processors).

.

.







  1. - . 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"]
    }
          
          





  2. - API - asgi-, add_tags:

    filebeat.docker.yml









    processors:
      - drop_fields:
          ...
      - add_tags:
        when:
          contains:
            "message": "app-log"
        tags: [test-app]
        target: "environment"
          
          





  3. 私たちは、構造化メッセージのフィールド使用して、ログメッセージを解剖ハンドラをして使用して削除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の便利なダッシュボードを取得します。







ご清聴ありがとうございました!








All Articles