ホームページ Java &#&チュートリアル Spring BootとFlumeをベースにしたログ収集・分析システムを構築する

Spring BootとFlumeをベースにしたログ収集・分析システムを構築する

Jun 23, 2023 am 08:53 AM
spring boot ログ分析 flume

企業システムの規模が拡大するにつれ、システムログはますます大規模になり、信頼性の高いログ収集および分析システムがなければ、システムを効果的に監視および保守することが困難になります。この記事では、Spring Boot と Flume をベースにした効率的なログ収集・分析システムの構築方法を紹介します。

  1. 前提条件

開始する前に、次のソフトウェアをインストールして設定する必要があります:

  • JDK 8 以降
  • Maven 3.3 以降
  • Apache Flume 1.9.0 以降
  • Elasticsearch 7.6.2 以降
  • Kibana 7.6.2 以降
  1. Spring Boot アプリケーションの構成

まず、Spring Boot アプリケーションを作成し、必要な依存関係を追加する必要があります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
ログイン後にコピー

application.properties ファイルに、次の設定:

# 应用端口号
server.port=8080

# log4j2配置
logging.config=classpath:log4j2.xml

# flume配置
flume.agentName=myflume
flume.sourceType=avro
flume.clientType=load-balancing
flume.hosts=localhost:41414

# elasticsearch配置
spring.elasticsearch.rest.uris=http://localhost:9200
ログイン後にコピー

上記の設定では、アプリケーションのポート番号、log4j2 設定ファイル、Flume 関連の設定、および Elasticsearch のアクセス URI を指定しました。

  1. ログ コレクター

アプリケーション ログを Flume に送信するには、カスタム log4j2 アペンダーを作成する必要があります。

@Plugin(name = "Flume", category = "Core", elementType = "appender", printObject = true)
public class FlumeAppender extends AbstractAppender {

    private static final ObjectMapper MAPPER = new ObjectMapper();
    private final FlumeClient client;
    private final String sourceType;

    protected FlumeAppender(String name, Filter filter, Layout<? extends Serializable> layout,
                            FlumeClient client, String sourceType) {
        super(name, filter, layout, true);
        this.client = client;
        this.sourceType = sourceType;
    }

    @PluginFactory
    public static FlumeAppender createAppender(@PluginAttr("name") String name,
                                               @PluginElement("Filters") Filter filter,
                                               @PluginElement("Layout") Layout<? extends Serializable> layout,
                                               @PluginAttr("sourceType") String sourceType,
                                               @PluginAttr("hosts") String hosts) {
        if (name == null) {
            LOGGER.error("FlumeAppender missing name");
            return null;
        }
        if (client == null) {
            LOGGER.error("FlumeAppender missing client");
            return null;
        }
        return new FlumeAppender(name, filter, layout, createClient(hosts), sourceType);
    }

    private static FlumeClient createClient(String hosts) {
        LoadBalancingRpcClient rpcClient = new LoadBalancingRpcClient();
        String[] hostArray = hosts.split(",");
        for (String host : hostArray) {
            String[] hostParts = host.split(":");
            rpcClient.addHost(new InetSocketAddress(hostParts[0], Integer.parseInt(hostParts[1])));
        }
        Properties props = new Properties();
        props.setProperty(RpcClientConfigurationConstants.CONFIG_CLIENT_TYPE, "default_loadbalance");
        props.setProperty(RpcClientConfigurationConstants.CONFIG_HOSTS, hosts);
        props.setProperty(RpcClientConfigurationConstants.CONFIG_MAX_BACKOFF, "10000");
        AvroEventSerializer serializer = new AvroEventSerializer();
        serializer.configure(props, false);
        return new FlumeClient(rpcClient, serializer);
    }

    @Override
    public void append(LogEvent event) {
        try {
            byte[] body = ((StringLayout) this.getLayout()).toByteArray(event);
            Map<String, String> headers = new HashMap<>();
            headers.put("timestamp", Long.toString(event.getTimeMillis()));
            headers.put("source", "log4j");
            headers.put("sourceType", sourceType);
            Event flumeEvent = EventBuilder.withBody(body, headers);
            client.sendEvent(flumeEvent);
        } catch (Exception e) {
            LOGGER.error("Failed to send event to Flume", e);
        }
    }
}
ログイン後にコピー

上記のコードでは、ログ イベントを Flume イベントにパッケージ化して Flume サーバーに送信する log4j2 アペンダーを実装しました。

log4j2 設定ファイルを作成し、FlumeAppender を設定します。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Flume name="flume" sourceType="spring-boot" hosts="${flume.hosts}">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Flume>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="flume"/>
        </Root>
    </Loggers>
</Configuration>
ログイン後にコピー

この log4j2 構成ファイルでは、FlumeAppender を定義し、ルート ロガーでそれを参照します。

  1. Flume 構成

Flume エージェント内のアプリケーションから送信されたログ メッセージを受信し、Elasticsearch に送信するように Flume を構成する必要があります。

以下に示すように Flume 設定ファイルを作成します。

# Define the agent name and the agent sources and sinks
myflume.sources = mysource
myflume.sinks = mysink
myflume.channels = channel1

# Define the source
myflume.sources.mysource.type = avro
myflume.sources.mysource.bind = 0.0.0.0
myflume.sources.mysource.port = 41414

# Define the channel
myflume.channels.channel1.type = memory
myflume.channels.channel1.capacity = 10000
myflume.channels.channel1.transactionCapacity = 1000

# Define the sink
myflume.sinks.mysink.type = org.elasticsearch.hadoop.flume.ElasticsearchSink
myflume.sinks.mysink.hostNames = localhost:9200
myflume.sinks.mysink.indexName = ${type}-%{+YYYY.MM.dd}
myflume.sinks.mysink.batchSize = 1000
myflume.sinks.mysink.typeName = ${type}

# Link the source and sink with the channel
myflume.sources.mysource.channels = channel1
myflume.sinks.mysink.channel = channel1
ログイン後にコピー

Flume 構成ファイルでは、エージェント、ソース、シンクを定義します。ソースは avro タイプ、ポート 41414 にバインドされ、channel1 はメモリ タイプ、容量は 10000、transactionCapacity は 1000 です。シンクは ElasticsearchSink タイプで、ローカル ホストのポート 9200 に type という名前のインデックスを作成し、イベントが 1000 件に達するとバッチで Elasticsearch に送信します。

  1. Elasticsearch と Kibana の構成

最後に、Elasticsearch と Kibana を構成する必要があります。 Elasticsearch では、Flume 設定ファイルで定義されたインデックス名と一致するインデックスを作成する必要があります。

Kibana では、インデックス スキーマを作成する必要があります。 Kibana のメイン メニューで、[管理]、[Kibana] の順に選択します。 Kibanaのインデックスパターンで「インデックスパターンの作成」を選択します。 Flume 構成ファイルで定義されているインデックス名を入力し、プロンプトに従って構成します。

アプリケーションのログ メッセージを表示するには、Kibana のダッシュボードを作成する必要もあります。 Kibana のメイン メニューで、[ダッシュボード]、[ダッシュボードの作成] の順に選択します。 「ビジュアライゼーション」タブで、「ビジュアライゼーションの追加」を選択します。データ テーブルを選択し、必要なフィールドと視覚化オプションを設定します。

  1. 結論

この記事では、Spring Boot と Flume を使用して効率的なログ収集と分析システムを構築する方法を紹介しました。アプリケーションのログ イベントを Flume サーバーに送信するためにカスタム log4j2 Appender を実装し、ログ分析と視覚化に Elasticsearch と Kibana を使用しました。この記事が独自のログ収集および分析システムの構築に役立つことを願っています。

以上がSpring BootとFlumeをベースにしたログ収集・分析システムを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Linux 環境で Splunk を使用してログ分析を行うにはどうすればよいですか? Linux 環境で Splunk を使用してログ分析を行うにはどうすればよいですか? Jul 29, 2023 pm 05:45 PM

Linux 環境でログ分析に Splunk を使用するにはどうすればよいですか?概要: Splunk は、大量のログ データからリアルタイムで貴重な情報を検索、分析、抽出するのに役立つ強力なログ分析ツールです。この記事では、Linux 環境に Splunk をインストールして設定し、ログ分析に使用する方法を紹介します。 Splunk のインストール: まず、Linux システムに Splunk をダウンロードしてインストールする必要があります。具体的な操作は次のとおりです: Splunk 公式 Web サイト (www.

Spring Boot + MyBatis + Atomikos + MySQL (ソースコード付き) Spring Boot + MyBatis + Atomikos + MySQL (ソースコード付き) Aug 15, 2023 pm 04:12 PM

実際のプロジェクトでは、分散トランザクションを避けるように努めます。ただし、場合によってはサービスを分割する必要があり、分散トランザクションの問題が発生することがあります。同時に、分散取引についても面接で質問されるので、このケースで練習し、面接で 123 について話すことができます。

Linux システムでログ分析と障害診断を実行する方法 Linux システムでログ分析と障害診断を実行する方法 Nov 07, 2023 am 11:42 AM

Linux システムのログ分析と障害診断を実行する方法については、具体的なコード例が必要です Linux システムでは、システムの実行状態やさまざまなイベントの発生を記録するログは非常に重要です。システム ログを分析および診断することで、システム障害の原因を特定し、問題を時間内に解決することができます。この記事では、一般的に使用される Linux ログ分析および障害診断方法をいくつか紹介し、対応するコード例を示します。ログ ファイルの場所と形式 Linux システムでは、通常、ログ ファイルは /var/lo に保存されます。

Nginx Proxy Managerのログ分析と監視 Nginx Proxy Managerのログ分析と監視 Sep 26, 2023 am 09:21 AM

NginxProxyManager のログ分析と監視には、特定のコード サンプルが必要です。はじめに: NginxProxyManager は、Nginx に基づくプロキシ サーバー管理ツールです。プロキシ サーバーを管理および監視するためのシンプルかつ効果的な方法を提供します。実際の運用では、潜在的な問題を発見したり、時間内にパフォーマンスを最適化するために、NginxProxyManager のログを分析および監視する必要があることがよくあります。この記事では、よく使われるいくつかの使い方を紹介します。

Spring Boot は MySQL の読み取り/書き込み分離テクノロジを実装します Spring Boot は MySQL の読み取り/書き込み分離テクノロジを実装します Aug 15, 2023 pm 04:52 PM

読み取りと書き込みの分離を実現する方法、Spring Boot プロジェクト、データベースは MySQL、永続層は MyBatis を使用します。

Python と Redis を使用したログ分析システムの構築: システムの状態をリアルタイムで監視する方法 Python と Redis を使用したログ分析システムの構築: システムの状態をリアルタイムで監視する方法 Jul 29, 2023 pm 04:09 PM

Python と Redis を使用したログ分析システムの構築: システムの健全性をリアルタイムで監視する方法 はじめに: システムを開発および保守する場合、システムの健全性を監視することは非常に重要です。優れた監視システムにより、システムのステータスをリアルタイムで把握し、問題を時間内に発見して解決し、システムの安定性とパフォーマンスを向上させることができます。この記事では、Python と Redis を使用して、システムの稼働状況をリアルタイムに監視するシンプルかつ実用的なログ分析システムを構築する方法を紹介します。環境をセットアップする: まず、Python をセットアップする必要があります。

Linux で grep コマンドを使用してログ分析を行うにはどうすればよいですか? Linux で grep コマンドを使用してログ分析を行うにはどうすればよいですか? Jul 29, 2023 pm 02:12 PM

Linux で grep コマンドを使用してログ分析を行うにはどうすればよいですか?はじめに: ログはシステムの運用中に生成される重要な記録であり、システムの運用、保守、トラブルシューティングにおいて、ログの分析は重要な作業です。 Linux オペレーティング システムの grep コマンドは、ログ分析に非常に適した強力なテキスト検索ツールです。この記事では、ログ分析によく使われるgrepコマンドの使い方と具体的なコード例を紹介します。 1. grep コマンドの概要 grep は Linux システムのファイルです

Nginx Proxy Managerを使用してWebサイトのアクセスログを収集および分析する方法 Nginx Proxy Managerを使用してWebサイトのアクセスログを収集および分析する方法 Sep 26, 2023 am 08:15 AM

NginxProxyManager を使用して Web サイトのアクセス ログを収集および分析する方法 はじめに: インターネットの急速な発展に伴い、Web サイトのログ分析は重要な部分になってきました。 Web サイトのアクセスログを収集して分析することで、ユーザーの行動習慣を理解し、Web サイトのパフォーマンスを最適化し、ユーザーエクスペリエンスを向上させることができます。この記事では、NginxProxyManager を使用して Web サイトのアクセス ログを収集および分析する方法 (NginxProxyManager の設定、収集など) を紹介します。

See all articles