Docker Compose を使用して ELK を迅速にデプロイする (テスト済みで効果的)

Docker Compose を使用して ELK を迅速にデプロイする (テスト済みで効果的)

1. 概要

1.1 定義

大規模なログの場合は集中管理が必要です。 ELK は完全なソリューション セットを提供しており、それらはすべてオープン ソース ソフトウェアです。それらは完璧に連携して、多くのアプリケーションのニーズを効率的に満たします。 ELK は、Elasticsearch、Logstash、Kibana を含む 3 つの技術製品の略称であり、プロジェクトでログ フレームワークとして使用できます。

1.2 機能説明

Elasticsearch は、データの収集、分析、保存という 3 つの主要機能を提供するオープンソースの分散検索エンジンです。

Logstash は主にログの収集、分析、フィルタリングを行うツールであり、多数のデータ取得方法をサポートしています。

Kibana もオープンソースの無料ツールです。Kibana は、Logstash および ElasticSearch 用のログ分析に適した Web インターフェイスを提供し、重要なデータ ログの集約、分析、検索に役立ちます。

それぞれの機能は以下の通りです。

簡単に言えば、アプリケーション サービスはログを生成し、Logger を通じて生成および出力します。Logstash は、http 経由でアプリケーション サービスによって生成されたログを受信します。Elasticsearch は、ログの全文検索機能を提供します。kibana は、Elasticsearch のグラフィカル インターフェイスを提供します。

2. ELKを展開する

この記事は Linux 上に展開されており、ルート ディレクトリとして /opt を使用しています。

2.1 ディレクトリとファイルを作成する

1) docker-elkディレクトリを作成し、このディレクトリ内にファイルやその他のディレクトリを作成します。

/opt/docker_elk ディレクトリに移動します。

2) logstash設定ファイルを作成する

/opt/docker_elk/logstashディレクトリに移動します
/opt/docker_elk/logstash/logstash.conf をタッチします。

3) logstash.confを設定します。内容は次の通りです。

入力{
  TCP {
    モード => "サーバー"
    ホスト => "0.0.0.0"
    ポート => 4560
    コーデック => json
  }
}
出力{
  エラスティックサーチ
    ホスト => "es:9200"
    インデックス => "logstash-%{+YYYY.MM.dd}"
  }
}

ここでは入力ログのポートを4560と指定しているので、外部に公開するポートも4560にする必要があります。

4) docker-compose.ymlファイルを作成する

/opt/docker_elk/docker-compose.yml をディレクトリに追加します。

2.2 docker-composeを設定して起動する

docker-compose.ymlを開き、

cd /opt/docker_elk
docker_compose.yml を vi する

設定内容は以下のとおりです。

バージョン: '3.7'
サービス:
  エラスティックサーチ:
    画像: elasticsearch:7.6.2
    コンテナ名: elasticsearch
    特権: true
    ユーザー: ルート
    環境:
      #クラスター名をelasticsearchに設定する
      - クラスター名=elasticsearch 
      #シングルノードモードで開始 - discovery.type=single-node 
      #JVM メモリ サイズを設定します - ES_JAVA_OPTS=-Xms512m -Xmx512m 
    ボリューム:
      - /opt/docker_elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins
      - /opt/docker_elk/elasticsearch/data:/usr/share/elasticsearch/data
    ポート:
      - 9200:9200
      - 9300:9300

  ログスタッシュ:
    イメージ: logstash:7.6.2
    コンテナ名: logstash
    ポート:
       -4560:4560
    特権: true
    環境:
      - TZ=アジア/上海
    ボリューム:
      #logstash 設定ファイルをマウントします - /opt/docker_elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf 
    依存:
      - エラスティックサーチ 
    リンク:
      # es ドメイン名を使用して elasticsearch サービスにアクセスできます - elasticsearch:es 
    
  キバナ:
    イメージ: kibana:7.6.2
    コンテナ名: kibana
    ポート:
        -5601:5601
    特権: true
    リンク:
      # es ドメイン名を使用して elasticsearch サービスにアクセスできます - elasticsearch:es 
    依存:
      - エラスティックサーチ 
    環境:
      # elasticsearch にアクセスするためのアドレスを設定します - elasticsearch.hosts=http://es:9200

ここで privileged を true に設定すると、このコンテナーにルート権限が付与されます。それでは始めましょう

docker-compose を起動 -d

起動時に、Elasticsearch が /usr/share/elasticsearch/data の下のファイルに権限がないというエラーを報告した場合は、ホスト マシンに読み取りおよび書き込み権限を付与する必要があります。

chmod 777 /opt/docker_elk/elasticsearch/data

起動中にエラーが発生した場合は、コンテナをシャットダウンして削除してから再起動する必要があります。削除コマンドをオフにします。

docker-compose ダウン

2.3 キバナを開く

1) http://192.168.0.150:5601 で Kibana Web インターフェースにアクセスします。左側の[設定]をクリックして管理インターフェースに入ります

2) インデックスパターンをクリックした後、インデックスの作成をクリックします。

3) 「インデックスの作成」をクリックします。

4) logstash-* という名前のインデックスを作成します。

5) 次に、次のステップで@timestampフィルターを選択します。

6) 作成が完了したら、「検出」をクリックし、作成したインデックスを選択します。

3. ログを収集する

この記事では、SpringBoot アーキテクチャを使用して、ログ情報を logstash に記録します。

3.1 環境整備

新しいSpringbootプロジェクトを作成し、Web依存関係をインポートする

<依存関係>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</依存関係>

さらに、logstash の依存関係をインポートする必要があります。

<!--logstash を統合する-->
<依存関係>
    <グループ ID>net.logstash.logback</グループ ID>
    <artifactId>logstash-logback-encoder</artifactId>
    <バージョン>6.6</バージョン>
</依存関係>

3.2 logbackによるログ記録

Logback は SpringBoot の組み込みログであり、Web 依存関係がインポートされている限り使用できます。

1) テストパッケージの下に新しいテストクラスとテストメソッドを作成します。

org.apache.logging.log4j.LogManager をインポートします。
org.apache.logging.log4j.Logger をインポートします。
org.junit.jupiter.api.Test をインポートします。
org.springframework.boot.test.context.SpringBootTest をインポートします。

@SpringBootテスト
パブリッククラスAppTest {

    //ログオブジェクトを作成する Logger logger = LogManager.getLogger(this.getClass());

    @テスト
    パブリックボイドtest1() {
        logger.info("logback のログ情報が来ています");
        logger.error("logback からのエラーメッセージが来ています");
    }
}

2) 必要なディレクトリに新しいlogback-spring.xmlを作成します。

<?xml バージョン="1.0" エンコーディング="UTF-8"?>
<!DOCTYPE 構成>
<構成>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    <!--アプリケーション名-->
    <プロパティ名="APP_NAME" 値="springboot-logback-elk-demo"/>
    <!--ログファイルの保存パス-->
    <プロパティ名="LOG_FILE_PATH" 値="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/logs}"/>
    <コンテキスト名>${APP_NAME}</コンテキスト名>
    <!-- 毎日ファイル アペンダーにログを記録します -->
    <アペンダー名="FILE" クラス="ch.qos.logback.core.rolling.RollingFileAppender">
        <ローリングポリシークラス="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <ファイル名パターン>${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log</ファイル名パターン>
            <maxHistory>30</maxHistory>
        </ローリングポリシー>
        <エンコーダ>
            <パターン>${FILE_LOG_PATTERN}</パターン>
        </エンコーダ>
    </アペンダー>
    <!--logstash アペンダーへの出力-->
    <アペンダー名="LOGSTASH" クラス="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--アクセス可能な logstash ログ収集ポート-->
        <宛先>192.168.86.128:4560</宛先>
        <エンコーダの文字セット="UTF-8" クラス="net.logstash.logback.encoder.LogstashEncoder"/>
    </アペンダー>
    <ルートレベル="INFO">
        <appender-ref ref="コンソール"/>
        <appender-ref ref="ファイル"/>
        <アペンダー参照ref="LOGSTASH"/>
    </ルート>
</構成>

3) テストメソッドを起動し、kibanaのログ情報を表示します。

情報を表示するときは、左側の使用可能なフィールドで「メッセージ」情報を除外することをお勧めします。「thread_name」フィールドはオプションです。フィルタリングされたフィールドも左側に表示され、右側の情報がより明確になります。

これらのログでは、時間は元のログの記録時間ではなく、logstash がログを収集した作成時間であることに注意してください。

3.3 log4j2 によるログ記録

log4j2 を使用するには、SpringBoot に付属するログを除外する必要があります。

1) logbackとimportの依存関係を除外する

<依存関係>
    <groupId>org.springframework.boot</groupId>
    <artifactId>スプリングブートスターター</artifactId>
    <除外事項>
        <!-- log4j ログを導入する場合は、デフォルトの logback を削除する必要があります -->
        <除外>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </除外>
    </除外>
</依存関係>

<!-- ログ管理 log4j2 -->
<依存関係>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
    <バージョン>2.1.0.RELEASE</バージョン>
</依存関係>

2) リソースディレクトリに新しいlog4j2.xmlを作成します。

<?xml バージョン="1.0" エンコーディング="UTF-8"?>

<構成ステータス="情報">
    <プロパティ>
        <!-- ログファイルが保存されるディレクトリを宣言します -->
        <プロパティ名="LOG_HOME">E:\logs</プロパティ>
        <プロパティ名="LOG_PATTERN"
                  value="%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread][%class{36}:%line] - %msg%n"></プロパティ>
    </プロパティ>

    <アペンダー>
        <!--コンソール設定を出力-->
        <コンソール名="コンソール" ターゲット="SYSTEM_OUT">
            <!-- コンソールはレベル以上の情報のみを出力し (onMatch)、その他の情報は直接拒否します (onMismatch) -->
            <ThresholdFilter レベル="情報" onMatch="承認" onMismatch="拒否"/>
            <!-- 出力ログ形式 -->
            <パターンレイアウト パターン="${LOG_PATTERN}"/>
        </コンソール>

        <!--ログをファイルに出力するための設定です。サイズがsizeを超えるたびに、このサイズのログは自動的にyear-monthで作成されたフォルダに保存され、アーカイブとして圧縮されます。 -->
        <RollingFile name="RollingFile" ファイル名="${LOG_HOME}\app_${date:yyyy-MM-dd}.log"
                     ファイルパターン="${LOG_HOME}\${date:yyyy-MM}\app_%d{yyyy-MM-dd}_%i.log">
            <ThresholdFilter レベル="情報" onMatch="承認" onMismatch="拒否"/>
            <!-- 出力ログ形式 -->
            <パターンレイアウト パターン="${LOG_PATTERN}"/>
            <!-- ログ ファイル サイズ -->
            <サイズベースのトリガーポリシー サイズ="20MB"/>
            <!-- 保持するファイルの最大数 -->
            <デフォルトのロールオーバー戦略最大="30"/>
        </ローリングファイル>

        <!--logstash アペンダーへの出力-->
        <ソケット名="ソケット" ホスト="192.168.86.128" ポート="4560" プロトコル="TCP">
            <!--logstash へのログ形式の出力-->
            <パターンレイアウト パターン="${LOG_PATTERN}"/>
        </ソケット>
    </アペンダー>

    <!-- 次に Logger を定義します。Appender は Logger が定義され導入されている場合にのみ有効になります。ルートのレベルはログレベルを構成し、他のレベルも構成できます -->
    <ロガー>
        <ルートレベル="情報">
            <AppenderRef ref="コンソール"/>
            <AppenderRef ref="ローリングファイル"/>
            <AppenderRef ref="ソケット"/>
        </ルート>
    </ロガー>

</構成>

上記のメインの赤い部分では、logstash サービスの IP アドレスとログを記録するためのポートを指定する必要があります。

3) テストクラスに新しいテストメソッドを作成する

org.apache.logging.log4j.LogManager をインポートします。
org.apache.logging.log4j.Logger をインポートします。
org.junit.jupiter.api.Test をインポートします。
org.springframework.boot.test.context.SpringBootTest をインポートします。

@SpringBootテスト
パブリッククラスAppTest {

    //ログオブジェクトを作成する Logger logger = LogManager.getLogger(this.getClass());

    ...

    @テスト
    パブリックボイドtest2() {
        logger.info("log4j2のログ情報です");
        logger.error("log4j2のエラーメッセージです");
    }
}

4) テストメソッドを起動し、kibanaのログ情報を表示します。

情報を表示するときは、左側の使用可能なフィールドで「メッセージ」情報を除外することをお勧めします。「thread_name」フィールドはオプションです。左側にはフィルタリングされたフィールドも表示され、右側にはログ自体の時間など、より明確な情報が表示されます。これがログ構成の設定です。

これで、Docker Compose を使用して ELK を迅速にデプロイする (テスト済みで効果的) 方法に関するこの記事は終了です。Docker Compose を使用した ELK のデプロイの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker Compose ワンクリック ELK デプロイ方式の実装
  • Docker-compose を使用して ELK クラスターを構築する方法
  • Docker-compose を使用して ELK をデプロイするためのサンプル コード
  • docker compose を使用して elk システムを構築する方法

<<:  ティックアニメーション効果を作成するための svg+css または js

>>:  MySQL 最適化 query_cache_limit パラメータの説明

推薦する

MySQL バッチ挿入ループの詳細なサンプルコード

背景数日前、MySql でページングを行っていたときに、ページングに制限 0,10 を使用するとデー...

Echatsチャートの大画面適応を実装する方法

目次説明する成し遂げるプロジェクトのディレクトリ構造は次のとおりです。効果図は以下のとおりです要約す...

Vue バックグラウンドでステータス ラベルをエレガントに記述する例

目次序文最適化変数の抽出二次包装 el-tag コンポーネント使用要約する序文バックエンドシステムの...

MySQLで日付と時刻を照会する方法

序文:プロジェクト開発では、一部のビジネス テーブル フィールドで日付と時刻の型が使用されることが多...

HTML およびプラグイン アプリケーションにおけるデータ カスタム属性の使用の概要

HTML にはデータ属性が含まれていることがよくあります。これらは HTML5 のカスタム属性です。...

MySQL データ ウェアハウスを保護するための 5 つのヒント

さまざまなソースからデータを集約することで、中央倉庫を作成できます。データ ウェアハウスは、ビジネス...

HttpとHttpsの両方をサポートするNginxの詳細な設定

最近の Web サイトでは Https をサポートすることがほぼ標準機能となっており、Nginx は...

MySQL 8.0.11 MSI バージョンのインストールと構成のグラフィック チュートリアル

この記事では、MySQL 8.0.11 MSIバージョンのインストールと設定のチュートリアルを参考ま...

CSS 8 目を引く HOVER 効果のサンプル コード

1. エフェクトHTMLを送信する <div id="送信ボタン">...

CSSポジショニングによる階層関係の問題の詳細な説明

絶対、相対、固定位置の位置決めabsolue: 絶対配置。上、下、左、右を使用して、配置先の親要素に...

HTML テーブルインライン形式の詳細な説明

インライン形式<colgroup>...</colgroup>属性名 属性値...

HTML にネストされた div の無効なマージンに対する解決策

div がネストされているときに margin が機能しない問題の解決策を次に示します。さて、マージ...

Remレイアウトを使用して適応性を実現する

以前、モバイル適応に関する記事を書きました。非常に長く、内容が多すぎて読みづらいものでした。そこで、...

Oracle と MySQL の高可用性ソリューションの比較分析

Oracle と MySQL の高可用性ソリューションについては、以前からまとめたいと思っていたので...

MySQL InnoDBストレージエンジンについて簡単に説明します

序文:ストレージ エンジンはデータベースの中核です。MySQL の場合、ストレージ エンジンはプラグ...