SpringBoot整合ELK做日志超完整詳細(xì)教程
SpringBoot整合ELK做日志
環(huán)境準(zhǔn)備
提前準(zhǔn)備一臺(tái)CentOS7,我的配置為 2c4g50g,為了方便,我會(huì)直接關(guān)閉服務(wù)器的防火墻,執(zhí)行以下代碼:
systemctl stop firewalld systemctl disable firewalld
安裝包準(zhǔn)備
ELK安裝包
本篇文章講解用 elasticsearch-7.17.7,kibana-7.17.7,logstash-7.17.7 和 SpringBoot 搭建日志系統(tǒng),可提前下載好安裝包,可使用以下命令下載,沒(méi)有wget可通過(guò)yum安裝:
wget \ https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.7-linux-x86_64.tar.gz \ https://artifacts.elastic.co/downloads/kibana/kibana-7.17.7-linux-x86_64.tar.gz \ https://artifacts.elastic.co/downloads/logstash/logstash-7.17.7-linux-x86_64.tar.gz
下載完成后如圖:

如果需要安裝 ik 分詞器,可以使用以下命令下載:
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.7/elasticsearch-analysis-ik-7.17.7.zip
Java11安裝包
因?yàn)橐顷慜racle賬戶進(jìn)行下載,所以我這里沒(méi)辦法直接提供下載鏈接,需要去到下載界面:
https://www.oracle.com/java/technologies/downloads/#java11
點(diǎn)擊這個(gè)進(jìn)行下載:

點(diǎn)擊同意協(xié)議:

登陸賬戶即可下載:

軟件安裝
安裝java11
我準(zhǔn)備將java11安裝在 /opt/environment 目錄下,所以我們執(zhí)行以下命令創(chuàng)建目錄:
mkdir -p /opt/environment
然后將 jdk-11.0.19_linux-x64_bin.tar.gz 解壓到 /opt/environment 目錄下,執(zhí)行以下命令:
tar -zxvf jdk-11.0.19_linux-x64_bin.tar.gz -C /opt/environment/
然后我們 /opt/environment/jdk-11.0.19/ 目錄查看(版本不同目錄可能不同):

隨后我們需要配置環(huán)境變量,將下面代碼加到 /etc/profile 文件的末尾:
# Set java environment JAVA_HOME=/opt/environment/jdk-11.0.19 ES_JAVA_HOME=$JAVA_HOME LS_JAVA_HOME=$JAVA_HOME PATH=$PATH:$JAVA_HOME/bin export JAVA_HOME ES_JAVA_HOME LS_JAVA_HOME PATH
其中 ES_JAVA_HOME 變量是ElasticSearch要求的, LS_JAVA_HOME 是Logstash要求的,但是要注意 JAVA_HOME=/opt/environment/jdk-11.0.19 的目錄是jdk的更目錄,如果不同注意修改。添加成功后查看 /etc/profile 文件末尾幾行:

使用以下命令使配置生效并檢查java是否安裝成功:
source /etc/profile java -version
看到下面結(jié)果代表安裝成功:

安裝ElasticSearch
我準(zhǔn)備將ElasticSearch安裝在 /opt/server 文件夾下,所以我們創(chuàng)建這個(gè)文件夾:
mkdir -p /opt/server
然后我們解壓 elasticsearch-7.17.7-linux-x86_64.tar.gz 文件到這個(gè)文件夾:
tar -zxvf elasticsearch-7.17.7-linux-x86_64.tar.gz -C /opt/server/
我們來(lái)到 /opt/server 目錄可以查看到解壓的結(jié)果:

因?yàn)閑s要求不能以root用戶運(yùn)行該應(yīng)用,所以我們?yōu)閑s創(chuàng)建一個(gè)用戶 elk,并將 elasticsearch-7.17.7 目錄和下面所有文件的所有權(quán)轉(zhuǎn)到用戶elk上:
# 創(chuàng)建用戶 useradd elk # 將所有權(quán)賦予給elk用戶 chown elk:elk -R elasticsearch-7.17.7
隨后我們需要改一些系統(tǒng)的配置文件,更詳細(xì)的說(shuō)明相見(jiàn)我的es安裝教程,這里我們就直接執(zhí)行以下代碼配置:
echo "elk hard nofile 65536" >> /etc/security/limits.conf echo "elk soft nofile 65536" >> /etc/security/limits.conf echo "vm.max_map_count=655360" >> /etc/sysctl.conf sysctl -p
因?yàn)槲覀儍?nèi)存不多,所以還需要改一下 es 當(dāng)中的 config/jvm.options 配置文件,在文件中加上以下三行代碼(參數(shù)可以根據(jù)自己的內(nèi)存大小自行修改):
-Xms256m -Xmx256m -Xmn128m
加上后如圖:

然后我們需要修改 config/elasticsearch.yml 配置文件,需要修改的內(nèi)容
# 集群的名字,根據(jù)自己愛(ài)好取一個(gè)好聽(tīng)的名字(需要取消注釋) cluster.name: test-log # 這個(gè)節(jié)點(diǎn)的名稱,可以自行修改(需要取消注釋) node.name: node-1 # 本節(jié)點(diǎn)的IP地址,注意修改為自己的IP地址(需要取消注釋) network.host: 192.168.3.233 # ES的端口(需要取消注釋) http.port: 9200 # 填寫(xiě)IP地址即可(需要取消注釋) discovery.seed_hosts: ["192.168.3.233"] # 都有哪些node,填寫(xiě)node的名字(需要取消注釋) cluster.initial_master_nodes: ["node-1"]
然后我們就可以切換到 elk 用戶啟動(dòng)elasticsearch:
# 切換到elk用戶 su elk cd elasticsearch-7.17.7/ # 啟動(dòng)elasticsearch bin/elasticsearch
看到這個(gè)代表啟動(dòng)成功:

可以嘗試訪問(wèn)服務(wù)器,可以看到訪問(wèn)成功:

安裝成功后我直接 Ctrl + C 退出運(yùn)行,然后執(zhí)行以下命令將其后臺(tái)運(yùn)行:
nohup bin/elasticsearch >> /dev/null &
安裝Kibana
我準(zhǔn)備將Kibana安裝在 /opt/server 文件夾下,我們已經(jīng)創(chuàng)建了這個(gè)文件夾,所以直接解壓文件(注意切換到root用戶):
# 注意執(zhí)行前使用 Ctrl + D 退出 elk 用戶并使用root用戶運(yùn)行 # 來(lái)到安轉(zhuǎn)包存放目錄 cd /usr/local/src/ # 解壓文件到指定文件夾 tar -zxvf kibana-7.17.7-linux-x86_64.tar.gz -C /opt/server/
同樣來(lái)到 /opt/server 文件夾下,將 kibana-7.17.7-linux-x86_64 文件夾以及下面的文件的所有權(quán)授予給 elk:
cd /opt/server/ chown elk:elk -R kibana-7.17.7-linux-x86_64/
執(zhí)行結(jié)果:

此時(shí)我們需要修改 config/kibana.yml 配置文件,修改的內(nèi)容為:
# kibana地址,注意修改為自己的服務(wù)器地址(需要取消注釋) server.host: "192.168.3.233" # elasticsearch地址,注意修改為自己的es服務(wù)器地址(需要取消注釋) elasticsearch.hosts: ["http://192.168.3.233:9200"] # 國(guó)際化地址修改為中文(需要取消注釋) i18n.locale: "zh-CN"
保存并退出后切換到elk用戶并啟動(dòng)kibana
# 來(lái)到kibana目錄 cd kibana-7.17.7-linux-x86_64/ # 切換到elk用戶 su elk # 啟動(dòng)kibana bin/kibana
看到這個(gè)代表啟動(dòng)成功:

我們可以訪問(wèn)一下這個(gè)地址:

訪問(wèn)后我們可以點(diǎn)擊左上角的三條杠然后點(diǎn)擊開(kāi)發(fā)工具,來(lái)到這個(gè)界面接下來(lái)會(huì)用到

同理我們退出運(yùn)行后讓kibanna進(jìn)入后臺(tái)運(yùn)行
# 先使用 Ctrl + C 退出運(yùn)行,然后讓kibana后臺(tái)運(yùn)行 nohup bin/kibana >> /dev/null &
安裝Logstash
我準(zhǔn)備將Logstash安裝在 /opt/server 文件夾下,我們已經(jīng)創(chuàng)建了這個(gè)文件夾,所以直接解壓文件(注意切換到root用戶):
# 注意執(zhí)行前使用 Ctrl + D 退出 elk 用戶并使用root用戶運(yùn)行 # 來(lái)到安轉(zhuǎn)包存放目錄 cd /usr/local/src/ # 解壓文件到指定文件夾 tar -zxvf logstash-7.17.7-linux-x86_64.tar.gz -C /opt/server/
同樣來(lái)到 /opt/server 文件夾下,將 logstash-7.17.7 文件夾以及下面的文件的所有權(quán)授予給 elk:
cd /opt/server/ chown elk:elk -R logstash-7.17.7/
執(zhí)行結(jié)果:

同樣我們需要修改一下 config/logstash.yml 配置文件,需要修改的內(nèi)容:
# 節(jié)點(diǎn)的名稱,取一個(gè)好聽(tīng)的名字(需要取消注釋) node.name: test-log # pipeline 配置文件的路徑,可自行修改,最好是空文件夾(需要取消注釋) path.config: /opt/server/logstash-7.17.7/config/conf/*.conf
同樣為了避免內(nèi)存不足的問(wèn)題,我們需要修改一下 config/jvm.options 配置文件,在文件中添加這幾行代碼(參數(shù)可以根據(jù)自己的內(nèi)存大小自行修改):
-Xms256m -Xmx256m -Xmn128m
加上后如圖:

然后我們?cè)俚轿覀兩厦?path.config 后面配置的文件夾(我配置的文件夾是/opt/server/logstash-7.17.7/config/conf/)中創(chuàng)建一個(gè) test-log.conf 文件,文件內(nèi)容為:
input {
tcp {
mode => "server"
port => 4560
}
}
filter {}
output {
elasticsearch {
action => "index"
hosts => ["192.168.3.233:9200"]
index => "test-log"
}
}文件中包含了以下幾個(gè)模塊:
- nput:日志的輸出來(lái)源,我們將暴露一個(gè)4560端口接收來(lái)自SpringBoot的日志
- filter:日志的過(guò)濾器,暫時(shí)不配置
- output:日志的輸出目的地,我們將日志輸出到elasticsearch中進(jìn)行保存,如果有多個(gè)es可以在中括號(hào)當(dāng)中填寫(xiě)多個(gè),以逗號(hào)隔開(kāi),其中index配置的test-log即為存儲(chǔ)日志用到的索引名稱,可自行修改
然后我們切換到elk用戶去啟動(dòng)logstash:
cd logstash-7.17.7/ su elk bin/logstash
看到這兩個(gè)輸出內(nèi)容代表Logstash啟動(dòng)成功:

我們可以按照上面的方法將Logstash轉(zhuǎn)換為后臺(tái)運(yùn)行:
nohup bin/logstash >> /dev/null &
編寫(xiě)SpringBoot項(xiàng)目
到現(xiàn)在為止我們已經(jīng)完成了服務(wù)端的搭建,現(xiàn)在我們開(kāi)始編寫(xiě)SpringBoot項(xiàng)目去整合到ELK當(dāng)中
初始化SpringBoot項(xiàng)目
我們?nèi)サ?https://start.spring.io/ 初始化一個(gè)SpringBoot項(xiàng)目,相信你們會(huì)操作這里就不再過(guò)多贅述:

修改代碼
將項(xiàng)目導(dǎo)入到idea或則其他的開(kāi)發(fā)工具,并在 pom.xml 里面多添加一個(gè) logback 整合 logstash 的依賴:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.3</version>
</dependency>如圖:

然后我們來(lái)到 application.yaml 文件中添加下面幾個(gè)配置:
server: port: 8080 log: # logstash 地址和端口,注意修改 logstash-host: 192.168.3.233:4560
接下來(lái)我們?cè)?resources 目錄下創(chuàng)建一個(gè) logback-spring.xml 配置文件,其中的內(nèi)容為:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路徑 -->
<property name="log.path" value="logs/test-log"/>
<!-- 日志輸出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<!-- 讀取SpringBoot配置文件獲取logstash的地址和端口 -->
<springProperty scope="context" name="logstash-host" source="log.logstash-host"/>
<!-- 控制臺(tái)輸出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系統(tǒng)日志輸出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!-- 循環(huán)政策:基于時(shí)間創(chuàng)建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的歷史 7天 -->
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 過(guò)濾的級(jí)別 -->
<level>INFO</level>
<!-- 匹配時(shí)的操作:接收(記錄) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配時(shí)的操作:拒絕(不記錄) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<!-- 循環(huán)政策:基于時(shí)間創(chuàng)建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的歷史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 過(guò)濾的級(jí)別 -->
<level>ERROR</level>
<!-- 匹配時(shí)的操作:接收(記錄) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配時(shí)的操作:拒絕(不記錄) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 將日志文件輸出到Logstash -->
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!-- 獲取logstash地址作為輸出的目的地 -->
<destination>${logstash-host}</destination>
<encoder chatset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<!-- 系統(tǒng)模塊日志級(jí)別控制 -->
<logger name="com.greateme" level="info"/>
<!-- Spring日志級(jí)別控制 -->
<logger name="org.springframework" level="warn"/>
<root level="info">
<appender-ref ref="console"/>
</root>
<!--系統(tǒng)操作日志-->
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
<appender-ref ref="logstash"/>
</root>
</configuration>重點(diǎn)講講下面幾行代碼
<!-- 讀取SpringBoot配置文件獲取logstash的地址和端口 --> <springProperty scope="context" name="logstash-host" source="log.logstash-host"/>
這一行代碼是用于讀取 application.yaml 配置文件中的 log.logstash-host 屬性,然后生成一個(gè) logback 的屬性,用于輸出日志所用
<!-- 將日志文件輸出到Logstash -->
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!-- 獲取logstash地址作為輸出的目的地 -->
<destination>${logstash-host}</destination>
<encoder chatset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>這幾行代碼就是配置輸出日志到logstash的代碼
編寫(xiě)Controller
我們來(lái)創(chuàng)建一個(gè)Controller來(lái)測(cè)試輸出一些日志:
TestLogController.java
package com.greateme.log.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 測(cè)試日志的Controller
* </p>
*
* @author XiaoHH
* @version 1.0.0
* @date 2023-04-26 22:59:13
* @file TestLogController.java
*/
@RestController
public class TestLogController {
/**
* 獲取日志輸出對(duì)象
*/
private static final Logger log = LoggerFactory.getLogger(TestLogController.class);
/**
* 測(cè)試輸出log的訪問(wèn)方法
*/
@GetMapping("/testLog")
public String testLog() {
log.error("測(cè)試輸出一個(gè)日志");
return "success";
}
}編寫(xiě)完成后項(xiàng)目的目錄結(jié)構(gòu)為:

我們來(lái)啟動(dòng)項(xiàng)目,我們可以發(fā)現(xiàn)啟動(dòng)時(shí)就輸出了八條日志:

我們來(lái)到kibana查詢一下索引列表:

然后再看看里面的數(shù)據(jù),發(fā)現(xiàn)的確新增了8條內(nèi)容:

我們編寫(xiě)了一個(gè)Controller也會(huì)輸出日志,我們?cè)L問(wèn)試試:

上面日志輸出成功了,我們?cè)賮?lái)看看es里面的數(shù)據(jù):

同時(shí)也可以看到日志的內(nèi)容可以看到我們自定義輸出的日志:

代碼倉(cāng)庫(kù)地址:
https://gitcode.net/m0_51510236/test-log
好了SpringBoot整合ELK就整合完畢了,以后再也不要一臺(tái)臺(tái)服務(wù)器登陸上去查看日志了,祝你們編碼開(kāi)心!
到此這篇關(guān)于SpringBoot整合ELK做日志(超完整)的文章就介紹到這了,更多相關(guān)SpringBoot ELK日志內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Java原生壓縮組件不支持中文文件名亂碼的問(wèn)題
本篇文章主要介紹了解決Java原生壓縮組件不支持中文文件名亂碼的問(wèn)題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
關(guān)于ObjectUtils.isEmpty()?和?null?的區(qū)別
這篇文章主要介紹了關(guān)于ObjectUtils.isEmpty()?和?null?的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
使用maven構(gòu)建java9 service實(shí)例詳解
本篇文章主要介紹了使用maven構(gòu)建java9 service實(shí)例詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
Java中的Semaphore信號(hào)量使用方法代碼實(shí)例
這篇文章主要介紹了Java中的Semaphore信號(hào)量使用方法代碼實(shí)例,Semaphore是一種基于計(jì)數(shù)的信號(hào)量,它可以設(shè)定一個(gè)閾值,基于此,多個(gè)線程競(jìng)爭(zhēng)獲取許可信號(hào),做自己的申請(qǐng)后歸還,超過(guò)閾值后,線程申請(qǐng)?jiān)S可信號(hào)將會(huì)被阻塞,需要的朋友可以參考下2023-11-11
Java+OpenCV實(shí)現(xiàn)人臉檢測(cè)并自動(dòng)拍照
這篇文章主要為大家詳細(xì)介紹了Java+OpenCV實(shí)現(xiàn)人臉檢測(cè),并調(diào)用筆記本攝像頭實(shí)時(shí)抓拍,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07

