Springboot整合ELFK(docker安裝部署ELFK)
前言:日志對于一個程式的重要程度不用多說,正好之前部署了一套分布式日志解決方案(通過查閱大佬教程做此記錄分享^ v ^)
- ELFK(Elasticsearch+Logstash+FileBeat+Kibana)
簡單流程:Filebeat 會定時監聽事先指定的日志檔案,如果日志檔案有變化,會將資料推送至 Logstash,Logstash通過配置進行過濾篩選存入es,最終通過 Kibana 將資料呈現出來,
一. 環境準備
準備服務器:目前使用linux centos搭建docker(docker環境搭建可查閱相關教程)
二.自定義網路:保證同一網路下的容器 (ElasticSearch、Logstash、Kibana)相互訪問
- 創建自定義網路elk
docker network create elk
- 查看已有網路(Docker自帶3種網路模式 bridge、host、none)
docker network ls

三. ELFK部署
- ElasticSerach+ik分詞器 部署
- 創建目錄并設定目錄777權限
mkdir -p /opt/elasticsearch/{config,data}
chmod 777 /opt/elasticsearch/{config,data}
- 拉取鏡像
ElasticSearch7以上版本需要JDK11支持,但是我們系統安裝的是JDK8(請自行匹配es版本)
docker pull elasticsearch:7.14.1
- 組態檔
vi /opt/elasticsearch/config/elasticsearch.yml
- 配置資訊
# 允許通過本機所有IP訪問
http.host: 0.0.0.0
# 是否支持跨域,默認為false
http.cors.enabled: true
http.cors.allow-origin: "*"
# elasticsearch 7版本以上的默認只允許1000個分片,可能會報分片不足的問題
cluster.max_shards_per_node: 10000
- 創建和啟動容器
docker run -d --name elasticsearch --net elk --restart always \
-p 9200:9200 -p 9300:9300 \
-e "ES_JAVA_OPTS=-Xms3g -Xmx3g" \
-e "discovery.type=single-node" \
-v /opt/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /opt/elasticsearch/data:/usr/share/elasticsearch/data \
elasticsearch:7.14.1
JVM堆記憶體大小建議設定大一點,不然可能會報錯,建議堆記憶體設定至少 256M以上,
- 安裝IK分詞器
復制對應es版本的ik分詞器完整下載地址—下載鏈接

- 容器下載安裝
docker exec -it elasticsearch /bin/sh
cd bin/
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.14.1/elasticsearch-analysis-ik-7.14.1.zip
- 查看已安裝的IK分詞器
elasticsearch-plugin list

- 重啟es生效
docker restart elasticsearch
- Kibana部署
- 拉取對應es版本的kibana鏡像
docker pull kibana:7.14.1
- 創建和啟動容器
docker run -d --name kibana --net elk --restart always \
-p 5601:5601 \
-e "I18N_LOCALE=zh-CN" \
kibana:7.14.1
-e 漢化啟動
-p 指定埠號
- 訪問 http://ip:5601,顯示kibana界面

- Logstash 部署
- 拉取對應es版本的Logstash鏡像
docker pull logstash:7.14.1
- 創建目錄并設定目錄777權限
mkdir -p /opt/logstash/{config,data,pipeline}
chmod 777 /opt/logstash/{config,data,pipeline}
- 組態檔(設定JVM堆記憶體大小)
vi /opt/logstash/config/jvm.options
-Xmx128m
-Xms128m
- Logstash配置
vi /opt/logstash/config/logstash.yml
# 允許通過本機所有IP訪問
http.host: "0.0.0.0"
# 指定使用管道ID
xpack.management.pipeline.id: ["main"]
- 管道ID和組態檔路徑映射
vi /opt/logstash/config/pipelines.yml
添加管道ID和管道組態檔目錄映射,注意符號 - 前后都要有空格(巨坑)
- pipeline.id: main
path.config: "/usr/share/logstash/pipeline"
- 管道配置
vi /opt/logstash/pipeline/logstash-log.conf
input {
beats {
port => 5044
client_inactivity_timeout => 36000
}
}
filter {
grok {
match =>{
"message"=>"(?<data>({.*}))"
}
}
grok {
match =>{
"message"=>"%{TIMESTAMP_ISO8601:logTime}"
}
}
grok {
match =>{
"message"=>"%{LOGLEVEL:logLevel}"
}
}
grok {
match => {
"message"=>"(?<userId>(?<=\"userId\":)(\d+))"
}
}
# 設定東八區時間
ruby {
code => "event.set('logstashTime', event.get('@timestamp').time.localtime + 8*60*60);
event.set('@timestamp', event.get('logstashTime'))"
}
mutate {
remove_field => ["@version"]
remove_field => ["tags"]
}
}
output {
if [appname] == "admin-server" {
elasticsearch {
hosts => ["http://es-ip:9200"]
index => "saas-admin-log"
}
}else if [appname] == "auth-server" {
elasticsearch {
hosts => ["http://es-ip:9200"]
index => "saas-auth-log"
}
}else if [appname] == "biz-server" {
elasticsearch {
hosts => ["http://es-ip:9200"]
index => "saas-biz-log"
}
}
stdout { codec => rubydebug }
}
可以看到在 output 里根據 appname 生成的不同索引庫,其中 appname 是 filebeat 自定義欄位,目的區分多應用日志,自定義欄位在 Filebeat部署的時候定義(es-ip:es部署服務的ip地址或域名),
- 創建和啟動容器
docker run -d --name logstash --net elk --restart always \
-p 5044:5044 -p 9600:9600 \
-v /opt/logstash/config:/usr/share/logstash/config \
-v /opt/logstash/data:/usr/share/logstash/data \
-v /opt/logstash/pipeline:/usr/share/logstash/pipeline \
logstash:7.14.1
- Filebeat 部署
- 拉取對應es版本的Filebeat鏡像
docker pull elastic/filebeat:7.14.1
- 創建目錄并設定目錄777權限
mkdir -p /opt/filebeat/config
chmod 777 /opt/filebeat/config
- 組態檔
vi /opt/filebeat/config/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /logs/admin-server/log.log
fields:
appname: admin-server # 自定義欄位,提供給 Logstash 用于區分日志來源
fields_under_root: true # 開啟自定義欄位
- type: log
enabled: true
paths:
- /logs/auth-server/log.log
fields:
appname: auth-server
fields_under_root: true
- type: log
enabled: true
paths:
- /logs/biz-server/log.log
fields:
appname: biz-server
fields_under_root: true
processors:
- drop_fields:
fields: ["log","input","host","agent","ecs"] # 過濾不需要的欄位
output.logstash:
hosts: ['ipxxxx:5044']
/logs/admin-server/log.log 是應用 admin服務 輸出的日志檔案路徑
ipxxxx 是部署 Logstash 服務器的IP地址
- 容器創建和啟動
docker run -d --name filebeat --restart=always \
--log-driver json-file \
--log-opt max-size=100m \
--log-opt max-file=2 \
-v /logs:/logs \
-v /opt/filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml \
elastic/filebeat:7.14.1
四. SpringBoot部署日志
- 配置日志模塊
在SpringBoot專案日志公共模塊中加入如下日志配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<!-- 日志級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設定為WARN,則低于WARN的資訊都不會輸出 -->
<!-- scan:當此屬性設定為true時,配置檔案如果發生改變,將會被重新加載,默認值為true -->
<!-- scanPeriod:設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒,
當scan為true時,此屬性生效,默認的時間間隔為1分鐘, -->
<!-- debug:當此屬性設定為true時,將列印出logback內部日志資訊,實時查看logback運行狀態,默認值為false, -->
<configuration scan="true" scanPeriod="10 seconds">
<contextName>logback</contextName>
<springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
<property name="LOG_HOME" value="/logs/${APP_NAME}" />
<!-- 彩色日志依賴的渲染類 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!--1. 輸出到控制臺-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是為開發使用,只配置最低級別,控制臺輸出的日志級別是大于或等于此級別的日志資訊-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 設定字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 2. 輸出到檔案 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 當前記錄的日志檔案完整路徑 -->
<file>${LOG_HOME}/log.log</file>
<!--日志檔案輸出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} -%5level ---[%15.15thread] %-40.40logger{39} : %msg%n%n</pattern>
<charset>UTF-8</charset> <!-- 此處設定字符集 -->
</encoder>
<!-- 日志記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志檔案保留天數-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--
<logger>用來設定某一個包或者具體的某一個類的日志列印級別、
以及指定<appender>,<logger>僅有一個name屬性,
一個可選的level和一個可選的 addtivity 屬性,
name:用來指定受此logger約束的某一個包或者具體的某一個類,
level:用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別,
如果未設定此屬性,那么當前logger將會繼承上級的級別,
addtivity:是否向上級logger傳遞列印資訊,默認是true,
-->
<!--
root節點是必選節點,用來指定最基礎的日志輸出級別,只有一個level屬性
level:用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
不能設定為INHERITED或者同義詞NULL,默認是DEBUG
可以包含零個或多個元素,標識這個appender將會添加到這個logger,
-->
<!-- 開發環境輸出至控制臺 -->
<springProfile name="dev">
<logger name="com.alibaba.nacos" level="OFF" addtivity="false"> </logger>
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</springProfile>
<!-- 生產環境輸出至檔案 -->
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</springProfile>
</configuration>
專案本地啟動,介面添加log列印(log.info(xxxx);)專案日志,會在本地根目錄生成日志檔案夾

然后將專案發布到線上,因為專案使用idea集成docker遠程部署(可以查詢相關資料進行部署),所以先添加Docker容器日志目錄掛載宿主機

然后啟動發布到服務器上
五. 查詢日志
查看 Logstash 處理日志
docker logs logstash
然后再Kibana中查找索引進行日志管理





ok!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/384172.html
標籤:其他
