Springboot常用于spring-cloud中,大家在使用spring-cloud多服務(wù)的時(shí)候常常會(huì)存在一個(gè)問題,就是某個(gè)服務(wù)報(bào)錯(cuò)了,去撈日志的時(shí)候要一個(gè)一個(gè)服務(wù)去監(jiān)控或者撈日志排查錯(cuò)誤信息,這樣很耗時(shí)耗力,Elasticsearch查詢數(shù)據(jù)非常方便,如果能夠?qū)⑷罩颈4娴紼lasticsearch中,出現(xiàn)問題時(shí)根據(jù)相關(guān)關(guān)鍵字和時(shí)間對(duì)查詢?nèi)罩緯?huì)節(jié)省大量時(shí)間,通過(guò)Kibana或者h(yuǎn)ead插件通過(guò)瀏覽器查詢,不需要登錄到服務(wù)端,操作簡(jiǎn)單方便,本文實(shí)現(xiàn)了springboot+log4j2+ELK(Elasticsearch+Logstash+Kibana)將日志集成到Elasticsearch中,ELK如何安裝部署可以參考作者之前的文章:
ELK(Elasticsearch+Logstash+Kibana)安裝、使用_醉酒橫刀的博客-CSDN博客
1、Springboot搭建
??????? sprignboot搭建大家可以在網(wǎng)上找到很多例子,此處不再贅述。
2、Springboot集成log4j2
??????? 集成log4j需要以下幾個(gè)步驟
??????? 1)引入pom依賴
??????? 需要將starter和stater-web中引入的log包排除,再引入log4j2依賴包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.1.5.RELEASE</version> <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-web</artifactId> <version>2.1.5.RELEASE</version> <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> <version>2.1.5.RELEASE</version> </dependency>
??????? 2)配置文件修改
????????在appliction.yml中新增如下配置
logging:
config: classpath:log4j2.xml level: com: test: debug
????????2)配置文件修改
????????log4j2.xml配置文件中內(nèi)容
<?xml version="1.0" encoding="UTF-8"?>
<!-- Configuration后面的status,這個(gè)用于設(shè)置log4j2自身內(nèi)部的信息輸出,可以不設(shè)置,
當(dāng)設(shè)置成trace時(shí),可以看到log4j2內(nèi)部各種詳細(xì)輸出
-->
<!-- monitorInterval:Log4j能夠自動(dòng)檢測(cè)修改配置 文件和重新配置本身,設(shè)置間隔秒數(shù) -->
<configuration monitorInterval="5">
<!-- 日志級(jí)別以及優(yōu)先級(jí)排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!-- 變量配置 -->
<Properties>
<!--
格式化輸出:
%d表示日期,
%thread表示線程名,
%-5level:級(jí)別從左顯示5個(gè)字符寬度
%msg:日志消息,%n是換行符
%logger{36} 表示 Logger 名字最長(zhǎng)36個(gè)字符
-->
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level}[%thread] %style{%logger{36}}{cyan} : %msg%n" />
<!-- 定義日志存儲(chǔ)的路徑,不要配置相對(duì)路徑 -->
<property name="FILE_PATH" value="./logs" />
<!-- 服務(wù)名 -->
<property name="FILE_NAME" value="order-service" />
</Properties>
<appenders>
<console name="Console" target="SYSTEM_OUT">
<!--輸出日志的格式-->
<PatternLayout pattern="${LOG_PATTERN}" disableAnsi="false" noConsoleNoAnsi="false"/>
<!--控制臺(tái)只輸出level及其以上級(jí)別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</console>
<!--
這個(gè)會(huì)打印出所有的info及以下級(jí)別的信息,每次大小超過(guò)size,
則這size大小的日志會(huì)自動(dòng)存入按年份-月份建立的文件夾下面并進(jìn)行壓縮,作為存檔
-->
<RollingFile name="RollingFileInfo"
fileName="${FILE_PATH}/info.log"
filePattern="${FILE_PATH}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-INFO_%i.log.gz">
<!--控制臺(tái)只輸出level及以上級(jí)別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval屬性用來(lái)指定多久滾動(dòng)一次,默認(rèn)是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="20MB"/>
</Policies>
<!-- DefaultRolloverStrategy屬性如不設(shè)置,則默認(rèn)為最多同一文件夾下7個(gè)文件開始覆蓋 -->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 這個(gè)會(huì)打印出所有的warn及以下級(jí)別的信息,每次大小超過(guò)size,則這size大小的日志會(huì)自動(dòng)存入按年份-月份建立的文件夾下面并進(jìn)行壓縮,作為存檔-->
<RollingFile name="RollingFileWarn"
fileName="${FILE_PATH}/warn.log"
filePattern="${FILE_PATH}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-WARN_%i.log.gz">
<!--控制臺(tái)只輸出level及以上級(jí)別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval屬性用來(lái)指定多久滾動(dòng)一次,默認(rèn)是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="20MB"/>
</Policies>
<!-- DefaultRolloverStrategy屬性如不設(shè)置,則默認(rèn)為最多同一文件夾下7個(gè)文件開始覆蓋-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 這個(gè)會(huì)打印出所有的error及以下級(jí)別的信息,每次大小超過(guò)size,則這size大小的日志會(huì)自動(dòng)存入按年份-月份建立的文件夾下面并進(jìn)行壓縮,作為存檔-->
<RollingFile name="RollingFileError"
fileName="${FILE_PATH}/error.log"
filePattern="${FILE_PATH}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd_HH}-ERROR_%i.log.gz">
<!--控制臺(tái)只輸出level及以上級(jí)別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval屬性用來(lái)指定多久滾動(dòng)一次,默認(rèn)是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="20MB"/>
</Policies>
<!-- DefaultRolloverStrategy屬性如不設(shè)置,則默認(rèn)為最多同一文件夾下7個(gè)文件開始覆蓋-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<Socket name="logstash" host="192.168.36.129" port="4560" protocol="TCP">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Socket>
</appenders>
<!--Logger節(jié)點(diǎn)用來(lái)單獨(dú)指定日志的形式,比如要為指定包下的class指定不同的日志級(jí)別等。-->
<!--然后定義loggers,只有定義了logger并引入的appender,appender才會(huì)生效-->
<loggers>
<!--過(guò)濾掉spring和mybatis的一些無(wú)用的DEBUG信息-->
<logger name="org.mybatis" level="info" additivity="false">
<AppenderRef ref="Console"/>
</logger>
<!--監(jiān)控系統(tǒng)信息-->
<!--若是additivity設(shè)為false,則 子Logger 只會(huì)在自己的appender里輸出,而不會(huì)在 父Logger 的appender里輸出。-->
<Logger name="top.fate" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
<appender-ref ref="logstash"/>
</root>
</loggers>
</configuration>
3、logstash配置修改及啟動(dòng)
???????? 1)配置文件修改
??????????????? 在logstash的bin目錄新建spring-boot-logstash.yml文件,具體內(nèi)容如下
????????????????/logstash-7.11.0/config/spring-boot-logstash.yml
??????????????? 注意修改ip地址和端口號(hào),output中的index會(huì)根據(jù)配置的命名規(guī)則自動(dòng)創(chuàng)建
????????????????
input {
? tcp {
??? #模式選擇為server
??? mode => "server"
??? #ip和端口根據(jù)自己情況填寫,端口默認(rèn)4560,對(duì)應(yīng)下文logback.xml里appender中的destination
??? host => "192.168.36.129"
??? port => 4560
??? #格式j(luò)son
??? codec => json_lines
? }
}
filter {
? #過(guò)濾器,根據(jù)需要填寫
}
output {
? elasticsearch {
??? action => "index"
??? #這里填寫es的地址,多個(gè)es要寫成數(shù)組的形式
??? hosts? => ["192.168.36.129:9200","192.168.36.130:9200","192.168.36.130:9200"]
??? #存放的索引名稱,這里每天會(huì)創(chuàng)建一個(gè)新的索引保存當(dāng)天的日志
??? index => "springfate-log-%{+YYYY.MM.dd}"
? }
}
???????? 2)logstash啟動(dòng)
?????? 切換到bin目錄下進(jìn)行啟動(dòng), 啟動(dòng)命令:
????????cd ../logstash/bin
./logstash -f /opt/ELK7.11.0/logstash-7.11.0/config/spring-boot-logstash.yml
??????? 啟動(dòng)成功后日志如下圖:
????????
?
4、log4j2連接logstash
????????log4j2連接logstash需要在log4j2.xml中配置如下圖所示即可,具體配置在上面的配置中有
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-439290.html
5、Kibana查詢?nèi)罩緮?shù)據(jù)
??????? 啟動(dòng)springboot項(xiàng)目,啟動(dòng)Elasticsearch、Logstash、Kibana,防火墻關(guān)閉或者開放相應(yīng)端口
之后可以監(jiān)控logstash的日志發(fā)現(xiàn)springboot的日志會(huì)抽取到es中
?????? 1)spring啟動(dòng)日志
??????? 我在springboot打印日志,每隔20秒打印一次日志
????????2)logstash抽取數(shù)據(jù)日志
??????? 在logstah日志中可以監(jiān)測(cè)到日志抽取,(我這邊日志json格式轉(zhuǎn)換有問題,還未解決)
?
??????? 3)Kibana查看Elasticsearh中新建的index
??????? 在kibana中可以看到以日期為單位新建的索引,日志在里面
?
??????? 4)Kibana查詢?nèi)罩緮?shù)據(jù)
????????登錄Kibana
?按照之前新建的查詢規(guī)則進(jìn)行搜索可以搜索出相關(guān)日志新星
至此,springboot+log4j2+ELK(Elasticsearch+Logstash+Kibana)簡(jiǎn)單整合已完成。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-439290.html
?
到了這里,關(guān)于Springboot通過(guò)log4j2+logstash整合日志到Elasticsearch中的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!