前言
去年公司由於不斷髮展,內部自研系統越來越多,所以後來搭建了一個日誌收集平臺,並將日誌收集功能以二方包形式引入自研系統,避免每個自研系統都要建立一套自己的日誌模組,節約了開發時間,管理起來也更加容易。
這篇文章主要介紹ELK最新版本的搭建,二方包的介紹可以看小霸王的另外一篇文章。
ELK介紹
- Elasticsearch 是一個分散式、Restful 風格的搜尋和資料分析引擎,能夠解決不斷湧現出的各種用例。作為 Elastic Stack 的核心,Elasticsearch 會集中儲存您的資料,讓您飛快完成搜尋,並對資料進行強大的分析。
- Logstash 是免費且開放的伺服器端資料處理管道,能夠從多個來源採集資料,轉換資料,然後將資料傳送到資料庫中。
- Kibana 是一個免費且開放的使用者介面,能夠讓您對 Elasticsearch 資料進行視覺化,從跟蹤查詢負載,到檢視應用請求的整個過程,都能輕鬆完成。
搭建平臺版本
平臺 | 版本 |
---|---|
linux | centos stream 9 |
java | openjdk 17 |
elasticsearch | 8.6.2 |
logstash | 8.6.2 |
kibana | 8.6.2 |
VMware Workstation Pro | 17 |
安裝
首先在linux虛擬機器上安裝docker
先解除安裝舊版本
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
升級yum
yum update
設定倉庫
yum install -y yum-utils device-mapper-persistent-data lvm2
使用阿里雲映象地址
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安裝 Docker Engine-Community
sudo yum install docker-ce docker-ce-cli containerd.io
設定docker開機啟動並啟動docker
sudo systemctl enable docker
sudo systemctl start docker
至此,docker已安裝完成,可以使用docker -v檢視版本,接下來就要安裝三大金剛了
docker pull elasticsearch:8.6.2
docker pull kibana:8.6.2
docker pull logstash:8.6.2
啟動
elasticsearch
接著先掛載elasticsearch的配置檔案,方便以後修改
首先建立elasticsearch.yml檔案
cluster.name: "docker-cluster"
network.host: 0.0.0.0
discovery.seed_hosts: 0.0.0.0
network.bind_host: 0.0.0.0
http.port: 9200
# Enable security features
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
enabled: false
# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
enabled: false
建立elasticsearch容器
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -v /home/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -e "discovery.type=single-node" elasticsearch:8.6.2
啟動elasticsearch容器
docker start elasticsearch
瀏覽器輸入http://你的虛擬機器ip:9200 顯示如下,說明es啟動成功
kibana
建立kibana容器,這裡使用到漢化 "-e I18N_LOCALE=zh-CN"
docker run -d --name kibana --link elasticsearch:elasticsearch -e "I18N_LOCALE=zh-CN" -p 5601:5601 kibana:8.6.2
啟動kibana
docker start kibana
輸入http://你的虛擬機器ip:5601/ 此時kibana啟動成功
logstash
在linux的/home目錄下新建logstash.yml檔案,其中index是索引的名稱,我們使用“xiaobawang-”字首加時間來生成每天的索引。
# 輸入端
input {
stdin { }
#為logstash增加tcp輸入口,後面springboot接入會用到
tcp {
mode => "server"
host => "0.0.0.0"
port => 5043
codec => json_lines
}
}
#輸出端
output {
stdout {
codec => rubydebug
}
elasticsearch {
hosts => ["http://你的虛擬機器ip地址:9200"]
# 輸出至elasticsearch中的自定義index名稱
index => "xiaobawang-%{+YYYY.MM.dd}"
}
}
然後啟動logstash,這裡配置檔案做了對映,/home/logstash.yml對映到/usr/share/logstash/pipeline/logstash.yml
docker run -d --name logstash -p 5043:5043 -p 5044:5044 --privileged=true -v /home/logstash.yml:/usr/share/logstash/pipeline/logstash.yml logstash:8.6.2
進入logstash容器
docker exec -it logstash /bin/bash
安裝json_lines所需的外掛
/usr/share/logstash/bin/logstash-plugin install logstash-codec-json_lines
重啟logstash,至此elk已全部安裝完成了。
docker restart logstash
Springboot整合logstash
下面使用logstash來將日誌傳送到elasticsearch,這裡以springboot為例。
新建一個springboot專案,引入如下包:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.3</version>
</dependency>
在resources資料夾下,建立logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--獲取springboot的yml配置資訊-->
<springProperty scope="context" name="applicationName" source="spring.application.name" defaultValue="default"/>
<!--定義日誌檔案的儲存地址 勿在 LogBack 的配置中使用相對路徑-->
<property name="LOG_HOME" value="/home"/>
<!--輸出到控制檯-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<withJansi>false</withJansi>
<encoder>
<!--<pattern>%d %p (%file:%line)- %m%n</pattern>-->
<!--格式化輸出:%d:表示日期 %thread:表示執行緒名 %-5level:級別從左顯示5個字元寬度 %msg:日誌訊息 %n:是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss} %highlight(%-5level) -- %boldMagenta([%thread]) %boldCyan(%logger) : %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 日誌傳送至logstash -->
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!-- logstash的伺服器地址和通訊埠 -->
<destination>你的虛擬機器IP地址:5043</destination>
<!-- encoder is required -->
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<!-- 在elasticsearch的index中追加applicationName欄位 -->
<customFields>{"applicationName":"${applicationName}"}</customFields>
</encoder>
</appender>
<!-- 按照每天生成日誌檔案 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日誌檔案輸出的檔名-->
<FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日誌檔案保留天數-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日誌檔案最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日誌輸出級別 -->
<root level="INFO">
<appender-ref ref="logstash"/>
<appender-ref ref="console"/>
</root>
</configuration>
新建一個controller請求
@RestController
public class TestController {
private final static Logger logger= LoggerFactory.getLogger(TestController.class);
@RequestMapping("/myTest")
public void test(){
logger.info("日誌開始"+System.currentTimeMillis());
logger.info("日誌結束"+System.currentTimeMillis());
}
}
訪問完請求後,進入Stack Management找到索引管理
可以看到springboot的3月4號日誌已經生成,下面進一步檢視日誌的內容。
點選左側選單,選擇Discover,建立資料檢視,因為索引名稱字首是xiaobawang-,所以索引模式填寫xiaobawang-*
就可以匹配每天生成的日誌。
至此,ELK已經搭建完成,但kibana的功能遠遠不限於此,還可以檢視不同維度的資料檢視報表,有興趣的童鞋可以研究研究。覺得有用的話,一鍵三連~