Elasticsearch+kibana+logstash 搭建日誌收集分析平臺
環境搭建:
虛擬機器記憶體配置:
sysctl -w vm.max_map_count=262144
檢視是否調整成功
sysctl -a|grep vm.max_map_count
永久修改:
vi /etc/sysctl.conf
在該conf檔案最下方新增一行
vm.max_map_count=262144
elasticsearch配置
這裡採用docker來進行部署,首先拉取elasticsearch的映象
docker pull elasticsearch:7.16.3
注意: elasticsearch,kibana和logstash最好版本號要一致,避免出現相容問題。
docker建立elk的網路
docker network create docker_elk
使用docker run建立elasticsearch容器
docker run -d --name elastic --net docker_elk -p 9200:9200 -p 9300:9300 \
-e "ES_JAVA_OPTS=-Xms64m -Xmx256m" -e "discovery.type=single-node" \
elasticsearch:7.16.3
啟動後,通過docker exec命令進入容器
docker exec -it elastic /bin/bash
進入config資料夾
vi elasticsearch.yml
注意: 由於elasticsearch的官方映象採用的是ubuntu系統,所以vi裡面的操作方式跟centos有所不同,這裡我們需要先移除掉再重新安裝最新的
apt remove vim-common
然後升級
apt update
安裝vim
apt install vim
編輯elasticsearch.yml,開啟xpack認證,個人親身經歷如若不開xpack認證,會出現kibana索引模式無法建立的錯誤,可能跟安全認證有關。在yml檔案下面新增以下欄位。
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
退出容器後,重新啟動容器
docker restart elastic
再次進入容器,設定安全認證密碼。
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
給elasticsearch預設使用者設定密碼,我這邊就設定了123456
設定好後,我們來進行kibana的配置。
kibana配置
先拉取kibana映象
docker pull kibana:7.16.3
建立kibana容器
docker run -d --name kibana --net docker_elk -p 5601:5601 kibana:7.16.3
然後接下來我們需要檢視一下elasticsearch容器在我們的docker_elk網路中的地址
docker inspect elastic
在一片配置中下拉到network配置項中
可以看到elasticsearch容器的地址為172.19.0.2
進入kibana容器‘’
docker exec -it kibana /bin/bashw
進入config資料夾
cd config
編輯kibana.yml
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://172.19.0.2:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN"
elasticsearch.username: "elastic"
elasticsearch.password: "123456"
xpack.reporting.encryptionKey: "a_random_string"
xpack.security.encryptionKey: "something_at_least_32_characters"
elasticsearch.host中設定剛才network獲取到的elasticsearch容器地址,然後修改
elasticsearch.password
修改完成後,退出並重啟容器
docker restart kibana
logstash的配置
先拉取映象
docker pull logstash:7.16.3
建立logstash 的配置檔案
##建立目錄 /data/logstash/config 和 配置檔案 logstash.yml
/data/logstash/config/logstash.yml
##建立目錄 /data/logstash/conf.d/ 和配置檔案 logstash.conf
/data/logstash/conf.d/logstash.conf
logstash.yml配置如下:
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://172.19.0.2:9200" ]
xpack.monitoring.enabled: true
path.config: /usr/share/logstash/conf.d/*.conf
path.logs: /var/log/logstash
其中xpack.monitoring.elasticsearch.hosts配置項改為獲取到的elasticsearch容器地址
logstash.conf的配置如下:
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 5047
codec => json_lines
}
}
output {
elasticsearch {
hosts => "172.19.0.2:9200"
index => "springboot-logstash-%{+YYYY.MM.dd}"
user => "elastic"
password => "123456"
}
}
下面host填寫elastsearch容器地址,index為日誌索引的名稱,user和password填寫xpack設定的密碼,port為對外開放收集日誌的埠
執行logstash
docker run -it -d -p 5047:5047 -p 9600:9600 \
--name logstash --privileged=true --net docker_elk -v \
/data/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml -v \
/data/logstash/conf.d/:/usr/share/logstash/conf.d/ logstash:7.16.3
5047埠是剛才port設定的埠
注意: 這裡有可能會出現jvm記憶體棧爆滿
解決方法:
find / -name jvm.options
使用該指令尋找logstash的jvm配置
找到對應容器的配置檔案並修改重啟
-Xms128m
-Xmx256m
如果記憶體大可以適當調高
Springboot配置
在maven中新增Logstash依賴
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.6</version>
</dependency>
在resources目錄下建立logback-spring.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!-- 獲取spring配置 -->
<springProperty scope="context" name="logPath" source="log.path" defaultValue="/app/logdir"/>
<springProperty scope="context" name="appName" source="spring.application.name"/>
<!-- 定義變數值的標籤 -->
<property name="LOG_HOME" value="${logPath}" />
<property name="SPRING_NAME" value="${appName}" />
<!-- 彩色日誌依賴的渲染類 -->
<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"/>
<!-- 鏈路追蹤sleuth 格式化輸出 以及 控制檯顏色設定變數 -->
<property name="CONSOLE_LOG_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) [${appName},%yellow(%X{X-B3-TraceId}),%green(%X{X-B3-SpanId}),%blue(%X{X-B3-ParentSpanId})] [%yellow(%thread)] %green(%logger:%L) :%msg%n"/>
<!-- #############################################定義日誌輸出格式以及輸出位置########################################## -->
<!--控制檯輸出設定-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<!-- <charset>GBK</charset> -->
</encoder>
</appender>
<!--普通檔案輸出設定-->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/log_${SPRING_NAME}_%d{yyyy-MM-dd}_%i.log</FileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>200MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!--aop介面日誌攔截檔案輸出-->
<appender name="bizAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>/app/log/biz/log_%d{yyyy-MM-dd}_%i.log</FileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>200MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!--開啟tcp格式的logstash傳輸,通過TCP協議連線Logstash-->
<!-- <appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">-->
<!-- <destination>10.11.74.123:9600</destination>-->
<!-- <encoder class="net.logstash.logback.encoder.LogstashEncoder" />-->
<!-- </appender>-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--可以訪問的logstash日誌收集埠-->
<destination>xxx.xxx.xxx.xxx:5047</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>Asia/Shanghai</timeZone>
</timestamp>
<pattern>
<pattern>
{
"app_name":"${SPRING_NAME}",
"traceid":"%X{traceid}",
"ip": "%X{ip}",
"server_name": "%X{server_name}",
"level": "%level",
"trace": "%X{X-B3-TraceId:-}",
"span": "%X{X-B3-SpanId:-}",
"parent": "%X{X-B3-ParentSpanId:-}",
"thread": "%thread",
"class": "%logger{40} - %M:%L",
"message": "%message",
"stack_trace": "%exception{10}"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
<!-- #############################################設定輸出日誌輸出等級########################################## -->
<!-- mybatis log configure-->
<!-- logger設定某一個包或者具體的某一個類的日誌列印級別 -->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<logger name="org.apache.ibatis.logging.stdout.StdOutImpl" level="DEBUG"/>
<!-- SaveLogAspect log configure外部介面呼叫-->
<!-- logger設定某一個包或者具體的某一個類的日誌列印級別 -->
<logger name="com.springweb.baseweb.log.aop.SaveLogAspect" additivity="false" level="INFO">
<!-- 同時輸出到兩個檔案 -->
<appender-ref ref="bizAppender"/>
<appender-ref ref="FILE"/>
</logger>
<root level="INFO">
<!-- 預設日誌檔案輸出 -->
<appender-ref ref="FILE"/>
<appender-ref ref="STDOUT"/>
<!-- 預設日誌檔案輸出logstash -->
<appender-ref ref="LOGSTASH"/>
</root>
</configuration>
destination中填寫部署logstash容器機器的ip地址,如果機器是本地則填寫內網地址,如果是外網伺服器,則填寫外網ip,埠要和logstash配置檔案中的port一致。
然後我們建立一些測試用例
@RestController
@Slf4j
public class LogController {
@GetMapping("/test")
public String showLog(){
log.warn("日誌測試,hahahahah");
log.info("初始日誌");
log.debug("出現bug啦");
log.error("出現錯誤");
return "ok";
}
}
執行Springboot
注意: 成功啟用logback配置檔案後,控制檯輸入會有所變化。
spring LOGO上會有logback的配置資訊。
如若沒變化,則表明logback配置檔案沒生效,沒生效則logstash收集不了日誌資訊。
kibana檢視資訊
進入kibana輸入賬號密碼後,來到該介面。
在索引管理中可以看到我們的日誌索引。
下方索引模式選項建立索引模式
建立好後,在discover介面上就可以看到我們收集到的日誌資訊了。
結尾:
如果docker容器啟動一會就自動停止了,大概率是出現錯誤了,這個時候可以使用docker logs 容器名 去檢視容器的日誌資訊來尋找問題。
要注意logstash配置檔案的埠要和springboot中logback配置檔案中的埠一致
如果是阿里雲或者騰訊雲等雲伺服器,注意控制檯防火牆也要開放相應埠
注意linux內部的防火牆,如果不是生產環境最好關閉。