ELK日誌收集分析系統
ELK Stack 是Elasticsearch、Logstash、Kiban三個開源軟件的組合。在實時數據檢索和分析場合,三者通常是配合共用,而且又都先後歸於 Elastic.co 公司名下,故有此簡稱。
基本組成軟件
- Elasticsearch是實時全文搜索和分析引擎,提供蒐集、分析、存儲數據三大功能;是一套開放REST和JAVA API等結構提供高效搜索功能,可擴展的分佈式系統。它構建於Apache Lucene搜索引擎庫之上。
- Logstash是一個用來蒐集、分析、過濾日誌的工具。它支持幾乎任何類型的日誌,包括系統日誌、錯誤日誌和自定義應用程序日誌。它可以從許多來源接收日誌,這些來源包括 syslog、消息傳遞(例如 RabbitMQ)和JMX,它能夠以多種方式輸出數據,包括電子郵件、websockets和Elasticsearch。
- Kibana是一個基於Web的圖形界面,用於搜索、分析和可視化存儲在 Elasticsearch指標中的日誌數據。它利用Elasticsearch的REST接口來檢索數據,不僅允許用戶創建他們自己的數據的定製儀表板視圖,還允許他們以特殊的方式查詢和過濾數據。
ELK的基於docker的搭建
注:會消耗2G+服務器內存
#1.新建elk文件夾
mkdir elk
#2.進入文件夾
cd elk
#3.創建 docker-compose.yml 文件並填入下文內容
vim docker-compose.yml
#4.新建文件及文件夾對應 docker-compose 的掛載目錄
mkdir es
cd es
mkdir plugins
mkdir data
#5.給設置data文件夾設置777權限 不然es啓動會報錯
chmod 777 data/
cd ..
mkdir logstash
cd logstash/
#6.創建 logstash.conf 文件並填入下文內容
vim logstash.conf
#7.通過命令啓動docker容器
docker-compose up -d
#通過命令查看elk的狀態
docker ps
docker ps內容
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d0784ecdcc5d logstash:7.8.0 "/usr/local/bin/dock…" 22 seconds ago Up 21 seconds 5044/tcp, 0.0.0.0:4560->4560/tcp, 9600/tcp logstash
8eb6c197b6f4 kibana:7.8.0 "/usr/local/bin/dumb…" 22 seconds ago Up 21 seconds 0.0.0.0:5601->5601/tcp kibana
f266b48803a9 elasticsearch:7.8.0 "/tini -- /usr/local…" 22 seconds ago Up 21 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch
可以看到三個都已啓動
docker-compose.yml
version: '3'
services:
elasticsearch:
image: elasticsearch:7.8.0
container_name: elasticsearch
restart: always
environment:
- "cluster.name=elasticsearch" #設置集羣名稱爲elasticsearch
- "discovery.type=single-node" #以單一節點模式啓動
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" #設置使用jvm內存大小
- TZ=Asia/Shanghai
volumes:
- ./es/plugins:/usr/share/elasticsearch/plugins #插件文件掛載
- ./es/data:/usr/share/elasticsearch/data #數據文件掛載
ports:
- 9200:9200
- 9300:9300
kibana:
image: kibana:7.8.0
container_name: kibana
links:
- elasticsearch:es #可以用es這個域名訪問elasticsearch服務
depends_on:
- elasticsearch #kibana在elasticsearch啓動之後再啓動
environment:
- SERVER_NAME=kibana
- "elasticsearch.hosts=http://es:9200" #設置訪問elasticsearch的地址
- XPACK_MONITORING_ENABLED=true
- TZ=Asia/Shanghai
ports:
- 5601:5601
logstash:
image: logstash:7.8.0
container_name: logstash
environment:
- TZ=Asia/Shanghai
volumes:
- ./logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #掛載logstash的配置文件
depends_on:
- elasticsearch #kibana在elasticsearch啓動之後再啓動
links:
- elasticsearch:es #可以用es這個域名訪問elasticsearch服務
ports:
- 4560:4560
logstash.conf
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines
type => "business"
}
}
output {
elasticsearch {
hosts => ["es:9200"]
action => "index"
codec => json
index => "%{type}-%{+YYYY.MM.dd}"
template_name => "business"
}
}
訪問http://服務器ip:9200/
可以看到以下 json 字符串
{
"name": "f266b48803a9",
"cluster_name": "elasticsearch",
"cluster_uuid": "yWdlWaN8RbOTuMZBJ7RRMg",
"version": {
"number": "7.8.0",
"build_flavor": "default",
"build_type": "docker",
"build_hash": "757314695644ea9a1dc2fecd26d1a43856725e65",
"build_date": "2020-06-14T19:35:50.234439Z",
"build_snapshot": false,
"lucene_version": "8.5.1",
"minimum_wire_compatibility_version": "6.8.0",
"minimum_index_compatibility_version": "6.0.0-beta1"
},
"tagline": "You Know, for Search"
}
訪問http://服務器ip:5601/
查看Kibana狀況
如需修改Kibana爲中文,則執行以下命令
#進入kibana容器
docker exec -it kibana bash
#切換進入 config 目錄
cd config/
#編輯 kibana.yml 文件
vi kibana.yml
#在文件的最後添加一行
i18n.locale: "zh-CN"
#退出容器
exit
#重啓kibana容器
docker restart kibana
再次訪問http://服務器ip:5601/
就可以看到界面變中文了
至此 ELK基於docker搭建完成
Springboot整合ELK實現日誌收集
在spring boot 項目中引入依賴
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.3</version>
</dependency>
在resource目錄中新建logback-spring
文件 用於收集日誌並將日誌轉發到logstash
注:要修改服務器ip
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--應用名稱-->
<springProperty scope="context" name="APP_NAME" source="spring.application.name" defaultValue="springBoot"/>
<!--LogStash訪問host-->
<springProperty name="LOG_STASH_HOST" scope="context" source="logstash.host" defaultValue="服務器ip"/>
<!-- 控制檯輸出日誌 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%level] [%c:%L] - %msg%n</pattern>
</encoder>
</appender>
<!--每天生成一個日誌文件,保存30天的日誌文件。-->
<appender name="DayFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/log.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/log.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%level] [%thread] [%c:%L] - %msg%n</pattern>
</encoder>
</appender>
<!--業務日誌輸出到LogStash-->
<appender name="LOG_STASH_BUSINESS" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>${LOG_STASH_HOST}:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>Asia/Shanghai</timeZone>
</timestamp>
<!--自定義日誌輸出格式-->
<pattern>
<pattern>
{
"service": "${APP_NAME:-}",
"level": "%level",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger",
"traceId": "%X{traceId:-}",
"message": "%message",
"stack_trace": "%exception"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
<!--指定logger name爲包名或類全名 指定級別 additivity設置是否傳遞到root logger -->
<logger name="slf4j" level="INFO" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="DayFile"/>
<appender-ref ref="LOG_STASH_BUSINESS"/>
</logger>
<!--slf4j2包下的類在ERROR級別時候傳遞到root logger中-->
<logger name="slf4j2" level="ERROR"/>
<!--根logger控制-->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="DayFile"/>
<appender-ref ref="LOG_STASH_BUSINESS"/>
</root>
</configuration>
啓動項目輸出日誌後,logstash就會收集日誌
訪問http://服務器ip:5601
並按如下設置
1.進入Stack Management
2.開始創建索引模式
3.定義索引模式
4.創建索引模式
5.創建完成後 效果如下
6.查看日誌
7.可以根據各種條件篩選日誌