一澜建、Kafka和ELK
-
Kafka
Kafka是由Apache軟件基金會開發(fā)的一個開源流處理平臺嫉你,由Scala和Java編寫九孩。Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),它可以處理消費者在網(wǎng)站中的所有動作流數(shù)據(jù)阱扬。 -
ELK
ELK是ElasticSearch+Logstash+Kibana的簡稱泣懊。
1、ElasticSearch
Elasticsearch是一個基于Lucene的搜索服務(wù)器麻惶。它提供了一個分布式多用戶能力的全文搜索引擎馍刮,基于RESTful web接口。Elasticsearch是用Java語言開發(fā)的窃蹋,并作為Apache許可條款下的開放源碼發(fā)布卡啰,是一種流行的企業(yè)級搜索引擎静稻。Elasticsearch也具有數(shù)據(jù)存儲能力。
2匈辱、Logstash
Logstash是一個具有實時流處理能力的開源數(shù)據(jù)收集引擎振湾。它可以動態(tài)聚合來自不同來源的數(shù)據(jù),并將數(shù)據(jù)過濾解析后存儲到目標(biāo)數(shù)據(jù)庫亡脸,通常是Elasticsearch押搪。這種格式化的數(shù)據(jù)便于下游產(chǎn)品進行數(shù)據(jù)分析和可視化。
basic_logstash_pipeline.png
其中input
和output
是必須的浅碾,filter
是可選的大州。
3、Kibana
Kibana 是一個免費且開放的用戶界面垂谢,能夠讓您對 Elasticsearch 數(shù)據(jù)進行可視化摧茴,并讓您在 Elastic Stack 中進行導(dǎo)航。您可以進行各種操作埂陆,從跟蹤查詢負載,到理解請求如何流經(jīng)您的整個應(yīng)用娃豹,都能輕松完成焚虱。
二、流程圖
三懂版、準備工作
-
一臺ELK服務(wù)器
我這邊直接使用工作電腦作為ELK服務(wù)器鹃栽,操作系統(tǒng)Windows(當(dāng)然也可以是Linux)。 -
一臺Kafka服務(wù)器
設(shè)置IP地址為192.168.0.107
躯畴,操作系統(tǒng)Ubuntu Server民鼓。
在各服務(wù)器上安裝好各種軟件,具體安裝可以參考官方教程蓬抄。
四丰嘉、啟動服務(wù)
Kafka
1、啟動zookeeper
我這邊是單服務(wù)嚷缭,所以不修改配置直接使用默認配置:
qian@qian:~/kafka/kafka_2.13-2.8.0$ ./bin/zookeeper-server-start.sh ./config/zookeeper.properties
2饮亏、啟動kafka
首先配置server.properties
,添加如下內(nèi)容:
############################# Socket Server Settings #############################
# The address the socket server listens on. It will get the value returned from
# java.net.InetAddress.getCanonicalHostName() if not configured.
# FORMAT:
# listeners = listener_name://host_name:port
# EXAMPLE:
# listeners = PLAINTEXT://your.host.name:9092
#listeners=PLAINTEXT://:9092
# Hostname and port the broker will advertise to producers and consumers. If not set,
# it uses the value for "listeners" if configured. Otherwise, it will use the value
# returned from java.net.InetAddress.getCanonicalHostName().
#advertised.listeners=PLAINTEXT://your.host.name:9092
advertised.listeners=PLAINTEXT://192.168.0.107:9092
advertised.listeners=PLAINTEXT://192.168.0.107:9092
這個配置可以讓局域網(wǎng)內(nèi)的其它服務(wù)器訪問kafka服務(wù)阅爽。
然后啟動kafka服務(wù):
qian@qian:~/kafka/kafka_2.13-2.8.0$ ./bin/kafka-server-start.sh ./config/server.properties
ElasticSearch
由于我安裝在Windows上路幸,所以直接雙擊elasticsearch.bat
啟動,服務(wù)訪問地址為http://localhost:9200/
付翁,如果想在瀏覽器中訪問需要安裝一個elasticsearch-head
插件简肴。
Logstash
在啟動Logstash服務(wù)前,首先簡單認識一下grok(官方教程)百侧,它是一個可以解析任何文本并且將文本結(jié)構(gòu)化的一個工具砰识。它可以高效處理syslog logs能扒,apache logs,webserver logs仍翰,mysql logs赫粥。簡單來說它就是一個內(nèi)置了很多日志元素正則表達式的工具。比如予借,日志中有一條xxxxxx 192.168.0.1 xxxx
這樣的信息越平,我們要把IP地址提取出來,然后可以這樣寫正則表達式:
(?<clientIP>(?<![0-9])(?:(?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(?![0-9]))
總之表達式很長灵迫,而grok
可以這樣寫:
%{IP:clientIP}
其中IP
就是對上面正則表達式的引用秦叛,clientIP
就是捕獲到的ip地址。Logstash內(nèi)置了很多像IP
這樣的正則表達式模板瀑粥,具體請查看https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns挣跋。
現(xiàn)在開始啟動Logstash,首先編寫一份logstash-elk.conf
配置文件狞换,內(nèi)容如下:
input {
kafka {
id => "spring_kafka_elk"
bootstrap_servers => "192.168.0.107:9092"
topics => ["kafka-elk-logg"]
auto_offset_reset => "latest"
}
}
filter {
grok {
patterns_dir => ["./patterns"]
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} \[%{GREEDYDATA:thread}\] %{LOGLEVEL:level}\s+%{JAVACLASS:class} - %{JAVALOGMESSAGE:logmessage}" }
}
date {
match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss.SSS" ]
}
}
output {
stdout { codec => rubydebug }
elasticsearch {
hosts =>["localhost:9200"]
}
}
input
和output
比較明顯避咆,就是日志的來源地和輸出地,filter
包含了grok
和date
這兩個元素修噪。
-
grok
patterns_dir
表示自定義的匹配模板文件查库,不過這里并沒有使用到。
match
就是我們需要如何解析日志黄琼,最終會解析成timestamp
樊销、thread
、level
脏款、class
围苫、logmessage
。比如有這樣一條日志2021-05-02 15:01:01 [main] DEBUG com.test.Hello - hello word
撤师,那么解析后結(jié)果如下:
timestamp = 2021-05-02 15:01:01
thread = main
level = DEBUG
class=com.test.Hello
logmessage=hello word
-
date
主要是告訴系統(tǒng)日志中的時間格式是yyyy-MM-dd HH:mm:ss.SSS
剂府。
在CMD中啟動Logstash服務(wù):
logstash-7.12.1\bin>logstash.bat -f E:\dev-tool\elasticsearch\logstash-7.12.1\config\logstash-elk.conf
Kibana
由于ELK服務(wù)都裝在了windows上,所以直接使用默認配置丈氓,雙擊kibana.bat
啟動周循,服務(wù)訪問地址為http://localhost:5601/
。
注意:以上各個路徑需要改成自己的安裝目錄
四万俗、Spring Boot配置
pom.xml
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-log4j-appender</artifactId>
<version>2.8.0</version>
</dependency>
...
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<Kafka name="Kafka" topic="kafka-elk-logg">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<Property name="bootstrap.servers">192.168.0.107:9092</Property>
</Kafka>
</Appenders>
<Loggers>
<Logger name="org.springframework" level="debug" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="com.drw.start" level="debug" additivity="false">
<AppenderRef ref="Kafka"/>
</Logger>
<Root level="INFO">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
通過配置我們將部分log4j2的日志寫入到了Kafka湾笛。
LogController
package com.drw.start.kafka.elk.controller;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LogController {
private static Logger log = LogManager.getLogger(LogController.class);
@RequestMapping("log")
public String logtest() {
log.debug("Spring Boot集成Kafka和ELK");
return "sucess";
}
}
啟動后直接在瀏覽器中訪問http://localhost:8080/log
,然后出現(xiàn)了錯誤闰歪,但是不要緊嚎研,這個只是找不到相關(guān)頁面而已,我們最主要的是將日志寫入到log4j2。
五临扮、查看Kibana
我們之前配置的logstash成功將日志進行解析论矾,kibana將這些信息作為列表項展示了出來
六、參考資源
http://kafka.apache.org/
https://www.elastic.co/guide/index.html
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html
https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns