Spring?Boot整合ELK實(shí)現(xiàn)日志采集與監(jiān)控
Spring Boot整合ELK實(shí)現(xiàn)日志采集與監(jiān)控
前言
在分布式項(xiàng)目中,可以采用ELK來(lái)作為日志的收集與分析系統(tǒng),提供一個(gè)統(tǒng)一的入口來(lái)對(duì)日志進(jìn)行收集,訪問(wèn)和管理。本文主要演示Spring Boot項(xiàng)目與ELK整合來(lái)實(shí)現(xiàn)日志的采集與監(jiān)控。
架構(gòu)圖示
本次測(cè)試工程中,采用的架構(gòu)如下圖所示,微服務(wù)通過(guò)TCP協(xié)議將日志提供給Logstach,Logstach對(duì)日志數(shù)據(jù)進(jìn)行采集和轉(zhuǎn)換之后,將日志數(shù)據(jù)發(fā)送到Elasticsearch存儲(chǔ)庫(kù),然后再通過(guò)Kibana對(duì)日志數(shù)據(jù)進(jìn)行可視化的呈現(xiàn)。
當(dāng)然還有很多種不同的實(shí)現(xiàn)方案,比如可以通過(guò)Beats替代Logstash,或者可以與消息隊(duì)列集成,通過(guò)生產(chǎn)消費(fèi)的模式來(lái)提升日志數(shù)據(jù)的可靠性等等,大家有興趣可以自行了解一下,官方也有一些圖示與講解,具體可以參考:https://www.elastic.co/guide/en/logstash/current/deploying-and-scaling.html
ELK搭建
本次搭建使用的是docker的方式,具體使用的軟件版本如下(本次用于測(cè)試,數(shù)據(jù)目錄未掛載出來(lái)):
elasticsearch | 7.14.2 |
---|---|
logstash | 7.14.2 |
kibana | 7.14.2 |
docker | 20.10.10 |
docker-compose | 1.29.2 |
在docker中創(chuàng)建一個(gè)自定義網(wǎng)絡(luò)elk,elasticsearch、logstash、kibana服務(wù)都基于該網(wǎng)絡(luò):
docker network create elk # 創(chuàng)建自定義網(wǎng)絡(luò)
啟動(dòng)elasticsearch:
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name elasticsearch --network elk -d elasticsearch:7.14.2
通過(guò)http://localhost:9200訪問(wèn),可以看到如下信息,說(shuō)明elasticsearch啟動(dòng)成功:
啟動(dòng)kibana,這邊指定了elasticsearch的地址,不指定的話默認(rèn)是http://elasticsearch:9200:
docker run -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://elasticsearch:9200" --name kibana --network elk -d kibana:7.14.2
啟動(dòng)完成之后,通過(guò)http://localhost:5601可以訪問(wèn)kibana:
啟動(dòng)logstash:
docker run -it -p 4560:4560 -p 4570:4570 -p 4580:4580 -v /Users/yuanzhihao/elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf --name logstash --network elk -d logstash:7.14.2
logstash對(duì)外開(kāi)放了三個(gè)端口,這樣可以將不同類型的日志投送到不同的端口,對(duì)日志進(jìn)行分類管理,比如運(yùn)行日志,安全日志,操作日志等等。同時(shí)還需要掛載一個(gè)logstash.conf配置文件,具體配置如下:
input { tcp { mode => "server" # 模式指定為server模式 host => "0.0.0.0" # server模式時(shí) ip地址是本機(jī) port => 4560 # 指定監(jiān)聽(tīng)端口 codec => json_lines # 指定輸入數(shù)據(jù)的解碼器 使用json格式 type => info # 日志的類型 } tcp { mode => "server" host => "0.0.0.0" port => 4570 codec => json_lines type => operation } tcp { mode => "server" host => "0.0.0.0" port => 4580 codec => json_lines type => security } } output { stdout { codec => rubydebug # 可以在logstash控制臺(tái)輸出日志 默認(rèn)就是rubydebug } if [type] == "info" { elasticsearch { hosts => "elasticsearch:9200" index => "info-log-%{+YYYY.MM.dd}" } } if [type] == "operation" { elasticsearch { hosts => "elasticsearch:9200" index => "operation-log-%{+YYYY.MM.dd}" } } if [type] == "security" { elasticsearch { hosts => "elasticsearch:9200" index => "security-log-%{+YYYY.MM.dd}" } } }
這邊的input輸入用到的是Logstash提供的一個(gè)TCP的一個(gè)插件,我新增了一個(gè)type表示日志的類型,有關(guān)于TCP插件的具體參數(shù)說(shuō)明可以參考:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-tcp.html
同時(shí),Logstash配置文件中也是支持條件表達(dá)式的,參考:https://www.elastic.co/guide/en/logstash/current/event-dependent-configuration.html#conditionals,這邊是對(duì)日志做了一個(gè)分類的處理,不同類型的日志對(duì)應(yīng)不同的端口,然后在elasticsearch上面創(chuàng)建不同的索引。
也可以通過(guò)docker-compose的方式,啟動(dòng)elk,docker-compose.yml配置文件如下:
version: '2.2' services: elasticsearch: image: elasticsearch:7.14.2 container_name: elasticsearch environment: - discovery.type=single-node ports: - 9200:9200 - 9300:9300 networks: - elk kibana: image: kibana:7.14.2 container_name: kibana depends_on: - elasticsearch environment: - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 ports: - 5601:5601 networks: - elk logstash: image: logstash:7.14.2 container_name: logstash environment: - node.name=es01 volumes: - /Users/yuanzhihao/elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf ports: - 4560:4560 - 4570:4570 - 4580:4580 networks: - elk networks: elk: driver: bridge
通過(guò)命令啟動(dòng),效果和上面docker啟動(dòng)一樣
docker-compose -f docker-compose.yml up -d
Spring Boot工程配置
Spring Boot項(xiàng)目的maven的pom文件配置如下,需要添加logstash-logback-encoder依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>6.6</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>
在代碼中添加日志打?。?/p>
/** * @author yuanzhihao * @since 2022/6/19 */ @SpringBootApplication @RestController @Slf4j public class Application { private static final Logger operationLog = LoggerFactory.getLogger("operation"); private static final Logger securityLog = LoggerFactory.getLogger("security"); @GetMapping("/hello") public String hello() { log.info("hello info log"); operationLog.info("hello operation log"); securityLog.info("hello security log"); return "Hello elk demo"; } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
在resources目錄下添加logback-spring.xml配置文件,根據(jù)日志類型輸出到logstash開(kāi)放出來(lái)的對(duì)應(yīng)的端口:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml"/> <springProperty scope="context" name="applicationName" source="spring.application.name"/> <appender name="infoLogstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>localhost:4560</destination> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"> <!--添加applicationName字段 --> <customFields>{"applicationName":"${applicationName}"}</customFields> </encoder> </appender> <appender name="operationLogstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>localhost:4570</destination> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"> <customFields>{"applicationName":"${applicationName}"}</customFields> </encoder> </appender> <appender name="securityLogstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>localhost:4580</destination> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"> <customFields>{"applicationName":"${applicationName}"}</customFields> </encoder> </appender> <logger name="operation" level="info"> <appender-ref ref="operationLogstash"/> </logger> <logger name="security" level="info"> <appender-ref ref="securityLogstash"/> </logger> <root level="INFO"> <appender-ref ref="infoLogstash"/> <appender-ref ref="CONSOLE"/> </root> </configuration>
驗(yàn)證
查看logstash是否接收到日志
啟動(dòng)Spring Boot項(xiàng)目??梢钥吹絣ogstash控制臺(tái)會(huì)打印對(duì)應(yīng)的日志,說(shuō)明logstash已經(jīng)接收到工程傳過(guò)來(lái)的日志,logstash驗(yàn)證ok。
查看索引是否已經(jīng)生效
訪問(wèn)http://localhost:9200/_cat/indices,這個(gè)可以查出來(lái)所有在elasticsearch上面創(chuàng)建的索引,可以看到我們的索引都已經(jīng)生效了。
日志分析
創(chuàng)建索引模式
訪問(wèn)http://localhost:5601/app/management/kibana/indexPatterns地址,選擇右上角Create index pattern創(chuàng)建索引模式
輸入索引名稱,這邊輸入operation-log-*
之后在配置中選擇@timestamp,并創(chuàng)建索引
查看日志
轉(zhuǎn)到http://localhost:5601/app/discover看板頁(yè)面,可以看見(jiàn)我們創(chuàng)建的所有的索引,添加Filter可以對(duì)字段進(jìn)行過(guò)濾,篩選出我們需要的日志信息。
結(jié)語(yǔ)
本次elk的整合的demo就到這邊,這個(gè)也差不多是我們項(xiàng)目目前使用的場(chǎng)景了,比較簡(jiǎn)單。如果有問(wèn)題可以留言。
參考地址:https://auth0.com/blog/spring-boot-logs-aggregation-and-monitoring-using-elk-stack
代碼鏈接:https://github.com/yzh19961031/blogDemo/tree/master/elkDemo
相關(guān)文章
myeclipse安裝Spring Tool Suite(STS)插件的方法步驟
這篇文章主要介紹了myeclipse安裝Spring Tool Suite(STS)插件的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08JavaSE基礎(chǔ)之反射機(jī)制(反射Class)詳解
反射機(jī)制有什么用?通過(guò)java語(yǔ)言中的反射機(jī)制可以操作字節(jié)碼文件,可以讀和修改字節(jié)碼文件。所以本文將為大家講講反射機(jī)制的使用,需要的可以參考一下2022-09-09sqlite數(shù)據(jù)庫(kù)的介紹與java操作sqlite的實(shí)例講解
今天小編就為大家分享一篇關(guān)于sqlite數(shù)據(jù)庫(kù)的介紹與java操作sqlite的實(shí)例講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02Java8 Optional判空詳解(簡(jiǎn)化判空操作)
這篇文章主要給大家介紹了關(guān)于Java8 Optional判空(簡(jiǎn)化判空操作)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05解決mybatisplus插入報(bào)錯(cuò)argument type mismatch的問(wèn)題
這篇文章主要介紹了解決mybatisplus插入報(bào)錯(cuò)argument type mismatch的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11SpringBoot整合thymeleaf 報(bào)錯(cuò)的解決方案
這篇文章主要介紹了SpringBoot整合thymeleaf 報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(詳解)
下面小編就為大家?guī)?lái)一篇基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06