背景
當(dāng)前商城是分布式,部署了xxxxx-c,xxxxx-pc,base-system三套業(yè)務(wù)系統(tǒng)。存在以下問(wèn)題:
1.出現(xiàn)錯(cuò)誤,無(wú)法及時(shí)的查看到對(duì)應(yīng)的錯(cuò)誤日志。
2.無(wú)法查看整個(gè)鏈路的請(qǐng)求,需要開(kāi)發(fā)人員或者運(yùn)維人員花費(fèi)大量的時(shí)間去整理問(wèn)題日志,找尋問(wèn)題日志。
3.日志搜索緩慢,耗時(shí),耗人。
解決方案
目前業(yè)界常見(jiàn)的分布式日志解決方案有:
1.elk:filebeat+Elasticsearch+kibana
2.Graylog:Elasticsearch + Graylog Server + Graylog Web
3.skywalking
4.plumelog:plumelog-server+Elasticsearch+redis/kafka
.....
方案選擇
目的:
1.收集分布式日志方便日常日志查詢(xún)
2.擁有鏈路追蹤,方便定位
3.擁有告警功能,方便及時(shí)解決問(wèn)題
4.簡(jiǎn)單,方便部署
基于以上目的,選擇了網(wǎng)上的plumelog解決方案
原因:
1.使用方便,接入簡(jiǎn)單
2.需要依賴(lài)的系統(tǒng)少,可以用業(yè)務(wù)系統(tǒng)的redis/kafka和es
3.查詢(xún)方便,支持鏈路追蹤,告警
4.系統(tǒng)輕量
plumelog系統(tǒng)架構(gòu)

plumelog3.5版本已經(jīng)將ui集成在server中,只需要啟動(dòng)server即可訪問(wèn)。
接入plumelog步驟
服務(wù)端部署
plumelog的Gitee官網(wǎng)地址:
https://gitee.com/plumeorg/plumelog 可以下載源碼
下載plumelog-server

maven打包

上傳相關(guān)jar包和配置

修改配置文件
spring.application.name=plumelog-server
server.port=8891
spring.thymeleaf.mode=LEGACYHTML5
spring.mvc.view.prefix=classpath:/templates/
spring.mvc.view.suffix=.html
spring.mvc.static-path-pattern=/plumelog/**
spring.boot.admin.context-path=admin
#值為4種 redis,kafka,rest,restServer,lite
#redis 表示用redis當(dāng)隊(duì)列
#kafka 表示用kafka當(dāng)隊(duì)列
#rest 表示從rest接口取日志
#restServer 表示作為rest接口服務(wù)器啟動(dòng)
#ui 表示單獨(dú)作為ui啟動(dòng)
#lite 簡(jiǎn)易模式啟動(dòng)不需要配置redis,es等
plumelog.model=redis
#lite模式下日志存儲(chǔ)路徑
#plumelog.lite.log.path=/Users/lucene
#如果使用kafka,啟用下面配置
#plumelog.kafka.kafkaHosts=172.16.247.143:9092,172.16.247.60:9092,172.16.247.64:9092
#plumelog.kafka.kafkaGroupName=logConsumer
#隊(duì)列redis地址,model配置redis集群模式,哨兵模式用逗號(hào)隔開(kāi),隊(duì)列redis不支持集群模式,lite模式可以全部注釋掉下面配置
plumelog.queue.redis.redisHost=192.168.xxx.xxx:6379
#如果使用redis有密碼,啟用下面配置
plumelog.queue.redis.redisPassWord=mtmy
plumelog.queue.redis.redisDb=15
#哨兵模式需要配置的
#plumelog.queue.redis.sentinel.masterName=myMaster
#redis解壓縮模式,開(kāi)啟后不消費(fèi)非壓縮的隊(duì)列
#plumelog.redis.compressor=true
#管理端redis地址 ,集群用逗號(hào)隔開(kāi),不配置將和隊(duì)列公用,lite模式可以全部注釋掉下面配置
#plumelog.redis.redisHost=127.0.0.1:6379
#如果使用redis有密碼,啟用下面配置
plumelog.redis.redisPassWord=mtmy
plumelog.redis.redisDb=15
#哨兵模式需要配置的
#plumelog.redis.sentinel.masterName=myMaster
#如果使用rest,啟用下面配置
#plumelog.rest.restUrl=http://127.0.0.1:8891/getlog
#plumelog.rest.restUserName=plumelog
#plumelog.rest.restPassWord=123456
#elasticsearch相關(guān)配置,Hosts支持?jǐn)y帶協(xié)議,如:http、https,集群逗號(hào)隔開(kāi),lite模式可以全部注釋掉下面配置
plumelog.es.esHosts=http://xxx.xxx.xxx.xxx:9200
plumelog.es.shards=5
plumelog.es.replicas=1
plumelog.es.refresh.interval=30s
#日志索引建立方式day表示按天、hour表示按照小時(shí)
plumelog.es.indexType.model=day
#hour模式下需要配置這個(gè)
#plumelog.es.maxShards=100000
#ES設(shè)置密碼,啟用下面配置
#plumelog.es.userName=elastic
#plumelog.es.passWord=elastic
#是否信任自簽證書(shū)
#plumelog.es.trustSelfSigned=true
#是否hostname驗(yàn)證
#plumelog.es.hostnameVerification=false
#以下配置不管什么模式都要配置
#單次拉取日志條數(shù)
plumelog.maxSendSize=5000
#拉取時(shí)間間隔,kafka不生效
plumelog.interval=1000
#plumelog-ui的地址 如果不配置,報(bào)警信息里不可以點(diǎn)連接
plumelog.ui.url=http://demo.plumelog.com
#管理密碼,手動(dòng)刪除日志的時(shí)候需要輸入的密碼
admin.password=123456
#日志保留天數(shù),配置0或者不配置默認(rèn)永久保留
admin.log.keepDays=7
#鏈路保留天數(shù),配置0或者不配置默認(rèn)永久保留
admin.log.trace.keepDays=7
#登錄配置,配置后會(huì)有登錄界面
#login.username=admin
#login.password=admin
#防止健康檢查異常錯(cuò)誤
spring.elasticsearch.rest.uris=${plumelog.es.esHosts}</pre>
啟動(dòng)服務(wù)端
# 執(zhí)行sh啟動(dòng)腳本
sh ./startup.sh

以下是客戶(hù)端操作:
1.引入pom依賴(lài)
<!-- 分布式日志plumelog依賴(lài) -->
<dependency>
<groupId>com.plumelog</groupId>
<artifactId>plumelog-logback</artifactId>
<version>3.5</version>
</dependency>
<!--traceId組件-->
<dependency>
<groupId>com.plumelog</groupId>
<artifactId>plumelog-trace</artifactId>
<version>3.5.3</version>
</dependency>
2.引入攔截器(給每個(gè)請(qǐng)求打上traceId)
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 自定義攔截器,添加攔截路徑和排除攔截路徑
registry.addInterceptor(new PlumeLogTraceIdInterceptor()).addPathPatterns("/**");
}
}
3.引入advice,生成調(diào)用鏈路
@Aspect
@Component
public class AspectConfig extends AbstractAspect {
// 寫(xiě)你需要生成鏈路的業(yè)務(wù)包路勁
@Around(value = "within(com.application.partition.applet.V1_0_0.controller..*)")
public Object around(JoinPoint joinPoint) throws Throwable {
return aroundExecute(joinPoint);
}
}
4.基于logback日志系統(tǒng)的日志配置文件修改
<!-- <springProperty scope="context" name="plumelog.appName" source="spring.application.name"/>-->
<!-- <springProperty scope="context" name="plumelog.redisHost" source="plumelog.redisHost"/>-->
<!-- <springProperty scope="context" name="plumelog.redisAuth" source="plumelog.redisAuth"/>-->
<!-- <springProperty scope="context" name="plumelog.masterName" source="plumelog.masterName"/>-->
<!-- <springProperty scope="context" name="plumelog.env" source="spring.profiles.active"/>-->
<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
<appName>####</appName>
<redisHost>####</redisHost>
<!-- 有密碼的添加redis密碼-->
<redisAuth>###</redisAuth>
<redisPort>###</redisPort>
<redisDb>###</redisDb>
<!-- <expand>sleuth</expand>-->
</appender>
<!-- 日志輸出級(jí)別 -->
<root level="info">
<appender-ref ref="plumelog"/>
</root>
plumelog前臺(tái)展示
日志查詢(xún)

1.中文需要用雙引號(hào)包含 例如:"異常",默認(rèn)會(huì)被按照單字體分割檢索


2.多個(gè)檢索條件可以用 AND OR NOT 來(lái)組合查詢(xún) 例如 "異常" AND "內(nèi)容"
[圖片上傳中...(image.png-6adc35-1677467868469-0)]
3.單個(gè)不可分割單詞可以用*開(kāi)頭或者結(jié)尾進(jìn)行模糊匹配 例如 *NullPointerException;查詢(xún)到了java.lang.NullPointerException;

- 4.注意:英文符號(hào)的 . : 等不是默認(rèn)的分隔符;需要用上面的方式去匹配
- 表格區(qū)域說(shuō)明
- 1.點(diǎn)擊列內(nèi)容幫旁邊的放大鏡按鈕可以完成快速篩選
- 2.左下角可以開(kāi)啟關(guān)閉顯示字段,不關(guān)閉瀏覽器設(shè)置不會(huì)消失
-
3.右下角可以自定義每頁(yè)日志顯示條數(shù),方便不通人的閱讀習(xí)慣
image.png
鏈路追蹤


報(bào)警管理


