首頁 Java 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 Appender。

@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);
        }
    }
}
登入後複製

以上程式碼中,我們實作了一個log4j2 Appender,它會將日誌事件打包成一個Flume Event,並傳送到Flume伺服器。

建立一個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,並在Root Logger中引用它。

  1. Flume設定

我們需要設定Flume,在Flume Agent中接收從應用程式傳送的日誌訊息,並將它們傳送到Elasticsearch。

建立一個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設定檔中,我們定義了一個agent,一個source和一個sink。 source是avro類型,綁定到41414埠上,channel1是一個memory類型,capacity為10000,transactionCapacity為1000。 sink是一個ElasticsearchSink類型,在本地主機的9200連接埠上建立一個名為type的索引,在1000個事件達到時批次提交到Elasticsearch。

  1. Elasticsearch和Kibana配置

最後,我們需要設定Elasticsearch和Kibana。在Elasticsearch中,我們需要建立一個與Flume設定檔中定義的索引名稱相符的索引。

在Kibana中,我們需要建立一個索引模式。在Kibana的主選單中,選擇"Management",然後選擇"Kibana"。在Kibana索引模式中,選擇"Create Index Pattern"。輸入Flume設定檔中定義的索引名稱,並依照提示進行設定。

我們還需要為Kibana建立一個Dashboard,以便查看應用程式的日誌訊息。在Kibana的主選單中,選擇"Dashboard",然後選擇"Create Dashboard"。在"Visualizations"標籤中,選擇"Add a visualization"。選擇"Data Table",然後配置所需的欄位和視覺化選項。

  1. 結論

在本文中,我們介紹如何使用Spring Boot和Flume建立一個高效的日誌收集和分析系統。我們實作了一個自訂的log4j2 Appender,將應用程式的日誌事件傳送到Flume伺服器,並使用Elasticsearch和Kibana進行日誌分析和視覺化。希望這篇文章能對你建立自己的日誌收集和分析系統有所幫助。

以上是基於Spring Boot和Flume建置日誌收集和分析系統的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

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官網(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和

如何利用Nginx Proxy Manager實現網站存取日誌的擷取與分析 如何利用Nginx Proxy Manager實現網站存取日誌的擷取與分析 Sep 26, 2023 am 08:15 AM

如何利用NginxProxyManager實現網站存取日誌的擷取與分析引言:隨著網際網路的快速發展,網站日誌分析已成為了重要的一環。透過網站存取日誌的採集與分析,可以了解使用者的行為習慣、優化網站效能以及改善使用者體驗。本文將介紹如何利用NginxProxyManager來實現網站存取日誌的擷取與分析,包括設定NginxProxyManager、收

Docker和Spring Boot的技術實踐:快速建立高效能的應用服務 Docker和Spring Boot的技術實踐:快速建立高效能的應用服務 Oct 21, 2023 am 08:18 AM

Docker和SpringBoot的技術實踐:快速建立高效能的應用服務引言:在當今的資訊時代,網路應用的開發和部署變得越來越重要。隨著雲端運算和虛擬化技術的快速發展,Docker作為一個輕量級的容器技術,受到了廣泛關注和應用。而SpringBoot作為快速開發和部署Java應用的框架,也得到了廣泛認可。本文將探討如何結合Docker和SpringB

See all articles