SpringCloud 分布式日志采集方案
點擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”
優(yōu)質(zhì)文章,第一時間送達(dá)
由于微服務(wù)架構(gòu)中每個服務(wù)可能分散在不同的服務(wù)器上,因此需要一套分布式日志的解決方案。spring-cloud提供了一個用來trace服務(wù)的組件sleuth。它可以通過日志獲得服務(wù)的依賴關(guān)系?;趕leuth,可以通過現(xiàn)有的日志工具實現(xiàn)分布式日志的采集。
這里使用的是ELK,也就是elasticsearch、logstash、kibana。
一、sleuth
第一步:sleuth管理端
sleuth一般單獨放在一個工程中。需要添加如下依賴
<dependency>??
????????<groupId>io.zipkin.javagroupId>??
????????<artifactId>zipkin-autoconfigure-uiartifactId>??
????????<scope>runtimescope>??
????dependency>?
??????
????<dependency>??
????????<groupId>io.zipkin.javagroupId>??
????????<artifactId>zipkin-serverartifactId>??
????dependency>??
配置服務(wù)注冊中心的地址
eureka:?
??client:?
????serviceUrl:?
??????defaultZone:?http://localhost:1111/eureka/
啟動類加入服務(wù)發(fā)現(xiàn)的注解和zipkin的注解,如下
package?com.wlf.demo;
?
import?org.springframework.boot.SpringApplication;
import?org.springframework.boot.autoconfigure.SpringBootApplication;
import?org.springframework.cloud.client.discovery.EnableDiscoveryClient;
?
import?zipkin.server.EnableZipkinServer;
?
@EnableDiscoveryClient?
@EnableZipkinServer??
@SpringBootApplication??
public?class?Application?{
???
????public?static?void?main(String[]?args)?{??
????????SpringApplication.run(Application.class,?args);??
????}??
?
}
這個時候啟動并訪問該微服務(wù)的地址,可以看到zipkin的管理頁面了
第二步:被管理的微服務(wù)端
在我們的其他微服務(wù)端需要簡單的配置,納入到zipkin的管理之中
引入依賴
<dependency>??
?????????<groupId>org.springframework.cloudgroupId>??
?????????<artifactId>spring-cloud-starter-sleuthartifactId>??
?????dependency>??
?????
?????<dependency>??
?????????<groupId>org.springframework.cloudgroupId>??
?????????<artifactId>spring-cloud-sleuth-zipkinartifactId>??
?????dependency>
加入如下配置
spring:?
??sleuth:?
????sampler:?
???????percentage:?1
??zipkin:?
????base-url:?http://localhost:9411
spring.sleuth.sampler.percentage:這個參數(shù)的意思是抓取100%的日志,只有通過抓取日志,才能獲知依賴關(guān)系。但是如果始終抓取日志的話對性能會有影響,因此可以自己配置。一般在開發(fā)環(huán)境,該值設(shè)置為1,生產(chǎn)環(huán)境視情況而定。
spring.zipkin.base-url:為第一步配置的zipkin管理端微服務(wù)的地址
現(xiàn)在分別啟動服務(wù)注冊中心,網(wǎng)關(guān),需要的微服務(wù),以及sleuth。
隨便調(diào)用一個微服務(wù)

然后我們可以看到相關(guān)的跟蹤日志

同樣我們也可以看到微服務(wù)之間的依賴關(guān)系,這里是通過網(wǎng)關(guān)調(diào)用了myservice-consumer-feign微服務(wù),然后通過myservice-consumer-feign微服務(wù)調(diào)用了myservice-provider微服務(wù)

二、搭建ELK
1、elasticsearch的安裝與配置,由于之前的文章已經(jīng)介紹了elasticsearch的單點,集群的安裝,head插件的安裝。這里不再總結(jié)。
2、kibana的安裝,沒什么好說的,解壓,運行就可以了
3、logstash的安裝,解壓即可
在config下新建配置文件
output?{
input?{
??tcp?{
??????port?=>?4560
??????codec?=>?json_lines
??}
}
?
output?{
??elasticsearch?{
?????hosts?=>?["192.168.160.66:9200","192.168.160.88:9200","192.168.160.166:9200"]
?????index?=>?"applog"
??}
}
其中port為端口號,codec表示通過json格式,elasticsearch.hosts表示elasticsearch的地址,這里是集群。index 為日志存儲的elasticsearch索引。
啟動需要調(diào)用bin下的logstash命令,通過-f指定配置文件
4、使用kibana
啟動elasticsearch、head、kibana、logstash
創(chuàng)建索引applog

將applog配置到kibana中,在index pattern中輸入我們的applog索引


最后點擊create即可
點擊菜單中的discover即可查看日志

三、logback配置
spring-cloud、logstash都是支持logback的,因此需要為微服務(wù)配置好相應(yīng)的logback-spring.xml
這里值得注意的是,在spring-boot中,logback-spring.xml的加載在application.yml之前。而我們需要在logback-spring.xml中使用
spring.application.name。因此,我們需要把spring.application.name配置提到bootstrap.yml中。
加載順序為bootstrap.yml,logback-spring.xml,application.yml
相比普通的logback-spring.xml,我們主要配置這幾樣?xùn)|西spring.application.name,logstash的appender
這里提供一個logback-spring.xml的例子
<configuration?scan="true"?scanPeriod="10?seconds">
??????????????
????<springProperty?scope="context"?name="springAppName"?
????????source="spring.application.name"?/>??????????
??????????????
????<property?name="CONSOLE_LOG_PATTERN"
??????????????value="%date?[%thread]?%-5level?%logger{36}?-?%msg%n"?/>????????????????
????????????????????
????<appender?name="stdout"?class="ch.qos.logback.core.ConsoleAppender">
?????<withJansi>truewithJansi>
??<encoder>
???????????<pattern>${CONSOLE_LOG_PATTERN}pattern>
?????<charset>utf8charset>
?????encoder>
????appender>??????
????
????<appender?name="logstash"
?????class="net.logstash.logback.appender.LogstashTcpSocketAppender">
?????<destination>192.168.160.66:4560destination>?
?????<encoder?class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
??????<providers>
???????<timestamp>
????????<timeZone>UTCtimeZone>
???????timestamp>
???????<pattern>
????????<pattern>
?????????{
???????????"severity":"%level",
???????????"service":?"${springAppName:-}",??
??????????????????????????"trace":?"%X{X-B3-TraceId:-}",??
??????????????????????????"span":?"%X{X-B3-SpanId:-}",??
??????????????????????????"exportable":?"%X{X-Span-Export:-}",??
??????????????????????????"pid":?"${PID:-}",??
??????????????????????????"thread":?"%thread",??
??????????????????????????"class":?"%logger{40}",??
??????????????????????????"rest":?"%message"??
?????????}
????????pattern>
???????pattern>
??????providers>
?????encoder>
????appender>
????
????<appender?name="dailyRollingFileAppender"?class="ch.qos.logback.core.rolling.RollingFileAppender">
???<File>main.logFile>
???<rollingPolicy?class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
?????<FileNamePattern>main.%d{yyyy-MM-dd}.logFileNamePattern>
?????<maxHistory>30maxHistory>?????????
???rollingPolicy>
???<encoder>
?????<Pattern>%d{HH:mm:ss.SSS}?[%thread]?%-5level?%logger{35}?-?%msg?%nPattern>
???encoder>????????
????<filter?class="ch.qos.logback.classic.filter.ThresholdFilter">
?????<level>DEBUGlevel>
???filter>
?appender>
??????????
????<springProfile?name="!production">?
????????<logger?name="com.myfee"?level="DEBUG"?/>
????????<logger?name="org.springframework.web"?level="INFO"/>
????????<root?level="info">??
?????????<appender-ref?ref="stdout"?/>??
?????????<appender-ref?ref="dailyRollingFileAppender"?/>??
?????????<appender-ref?ref="logstash"?/>?
?????root>?
????springProfile>
????
????<springProfile?name="production">?
??<logger?name="com.myfee"?level="DEBUG"?/>
????????<logger?name="org.springframework.web"?level="INFO"/>
????????<root?level="info">??
?????????<appender-ref?ref="stdout"?/>??
?????????<appender-ref?ref="dailyRollingFileAppender"?/>?
?????????<appender-ref?ref="logstash"?/>??
?????root>?
?springProfile>
configuration>
我們把message信息配置到了rest字段中。
三、查詢?nèi)罩?span style="display: none;">
啟動服務(wù)注冊中心,網(wǎng)關(guān),需要的微服務(wù),以及sleuth。
啟動elasticsearch,head,kibana,logstash,隨便運行一個服務(wù),比如

這里會輸出一行日志,內(nèi)容為myService-provider userController,通過網(wǎng)關(guān)調(diào)用

eclipse控制臺輸出日志

在kibana中搜索日志

我們看到日志信息在rest字段中。另外,通過trace和span還可以跟蹤到整個微服務(wù)的調(diào)用過程。到此為止,整個日志采集就搭建完成了。系統(tǒng)上線后只需要在elasticsearch中就能搜索到各個服務(wù)器上,各個微服務(wù)的日志內(nèi)容了。
