实时分布式日志系统plumelog落地
theme: v-green
一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第25天, 点击查看活动详情。
一.系统介绍
- 无代码入侵的分布式日志系统,基于log4j、log4j2、logback搜集日志,设置链路ID,方便查询关联日志
- 基于elasticsearch作为查询引擎
- 高吞吐,查询效率高
- 全程不占应用程序本地磁盘空间,免维护;对于项目透明,不影响项目本身运行
- 无需修改老项目,引入直接使用,支持dubbo,支持springcloud
二.架构
这里有两种版本:
- plumelog-lite版本,不用部署直接引用到项目中直接使用,不依赖任何外部中间件直接启动,部署极其方便,功能包含,日志查询,链路追踪,日志管理,适合单机小规模项目使用,目前只支持springboot+logback,log4j2组合,但是性能有限,一天10个G以内可以应付,最好是SSD硬盘,适合管理系统类的小玩家,一个公司有很多小系统需要日志集中管理
- redis,kafka模式需要单独部署服务,可以集群分布式部署,适合大型玩家,互联网公司
三.应用
3.1 lite应用
3.1.1 修改pom文件
<dependency>
<groupId>com.plumelog</groupId>
<artifactId>plumelog-lite-spring-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
3.1.2 配置logback.xml
<appender name="plumelog" class="com.plumelog.lite.logback.appender.LiteAppender">
<appName>plumelog</appName>
<!-- 日志存储位置 -->
<logPath>/plumelog/lite</logPath>
<!-- 日志保留天数 -->
<keepDay>30</keepDay>
</appender>
<!-- 添加 ref-->
<root level="INFO">
<appender-ref ref="plumelog"/>
</root>
3.1.3 在springboot启动类里添加扫描路径
如果原来你的项目没有扫描路径,不要只加这个,也要把你自己的项目的加了,不然只扫描plumelog的路径了。
@ComponentScan("com.plumelog")
3.1.4 访问
启动你的项目:输入你的项目地址+plumelog/#/访问,例如:http://localhost:8083/plumelog/#/
一定要加这个/#/后缀
3.1.5 实现控制台时时日志
还提供了控制台的时时日志,按下下文配置即可。
3.1.6 异常
有些用3.5版本会报错:org.apache.lucene.store.LockObtainFailedException: Lock held by this virtual machine
-
springcloud-alibaba需要在你的启动类里面加:System.setProperty("spring.cloud.bootstrap.enabled", "false");
public static void main(String[] args) { System.setProperty("spring.cloud.bootstrap.enabled", "false"); SpringApplication.run(LogServerStart.class, args); }
-
如果用的logback.xml 改成logback-spring.xml;
请参考官方文档:https://gitee.com/plumeorg/plumelog#/plumeorg/plumelog/blob/master/plumelog-lite/README.md
3.2 独立搭建版本
3.2.1 服务端安装
- 安装 redis 或者 kafka(一般公司redis足够) 安装 elasticsearch
- 下载安装包,plumelog-server
- 下载地址:https://gitee.com/plumeorg/plumelog/releases
- 配置plumelog-server,并启动,redis和kafka作为队列模式下可以部署多个plumelog-server达到高可用,配置一样即可
3.2.2 配置解析
#值为4种 redis,kafka,rest,restServer,lite
#redis 表示用redis当队列
#kafka 表示用kafka当队列
#rest 表示从rest接口取日志
#restServer 表示作为rest接口服务器启动
#ui 表示单独作为ui启动
#lite 简易模式启动不需要配置redis,es等
plumelog.model=redis
#lite模式下日志存储路径
#plumelog.lite.log.path=/lucene
#如果使用kafka,启用下面配置
#plumelog.kafka.kafkaHosts=172.16.247.143:9092,172.16.247.60:9092,172.16.247.64:9092
#plumelog.kafka.kafkaGroupName=logConsumer
#队列redis地址,model配置redis集群模式,哨兵模式用逗号隔开,队列redis不支持集群模式,lite模式可以全部注释掉下面配置
#当redis队列性能不够的时候,可以不同的项目单独配置单独的redis队列,用单独的plumelog-server去采集,公用一个管理redis
plumelog.queue.redis.redisHost=127.0.0.1:6379
#如果使用redis有密码,启用下面配置
#plumelog.queue.redis.redisPassWord=123456
#如果要切换db,redis必须要配置密码
#plumelog.queue.redis.redisDb=0
#哨兵模式需要配置的
#plumelog.queue.redis.sentinel.masterName=myMaster
#redis解压缩模式,开启后不消费非压缩的队列
#plumelog.redis.compressor=true
#管理端redis地址 ,集群用逗号隔开,不配置将和队列公用,lite模式可以全部注释掉下面配置,管理redis单独使用的时候支持集群模式
#plumelog.redis.redisHost=127.0.0.1:6379
#如果使用redis有密码,启用下面配置
#plumelog.redis.redisPassWord=123456
#plumelog.redis.redisDb=0
#哨兵模式需要配置的
#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相关配置,Hosts支持携带协议,如:http、https,集群逗号隔开,lite模式可以全部注释掉下面配置
plumelog.es.esHosts=127.0.0.1:9200
plumelog.es.shards=5
plumelog.es.replicas=1
plumelog.es.refresh.interval=30s
#日志索引建立方式day表示按天、hour表示按照小时
plumelog.es.indexType.model=day
#hour模式下需要配置这个
#plumelog.es.maxShards=100000
#ES设置密码,启用下面配置
#plumelog.es.userName=elastic
#plumelog.es.passWord=elastic
#是否信任自签证书
#plumelog.es.trustSelfSigned=true
#是否hostname验证
#plumelog.es.hostnameVerification=false
#以下配置不管什么模式都要配置
#单次拉取日志条数
plumelog.maxSendSize=100
#拉取时间间隔,kafka不生效
plumelog.interval=100
#plumelog-ui的地址 如果不配置,报警信息里不可以点连接
plumelog.ui.url=http://demo.plumelog.com
#管理密码,手动删除日志的时候需要输入的密码
admin.password=123456
#日志保留天数,配置0或者不配置默认永久保留
admin.log.keepDays=30
#链路保留天数,配置0或者不配置默认永久保留
admin.log.trace.keepDays=30
#登录配置,配置后会有登录界面
#login.username=admin
#login.password=admin
只需要更改redis、es等配置即可,如果有其他配置,请参考注释修改。
3.2.3 springboot+logback整合
其中项目使用了spring cloud alibaba +feign生态,经检测完美运行。
3.2.3.1 pom.xml引入
<dependency>
<groupId>com.plumelog</groupId>
<artifactId>plumelog-logback</artifactId>
<version>3.5.2</version>
</dependency>
3.2.3.2 logback-spring.xml引入
在logback-spring.xml适当的位置根据自己选型加入下文配置。
<appenders>
<!--使用redis启用下面配置-->
<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
<appName>plumelog</appName>
<redisHost>172.16.249.72:6379</redisHost>
<redisAuth></redisAuth>
</appender>
</appenders>
<!--使用上面三个三选一加入到root下面-->
<root level="INFO">
<appender-ref ref="plumelog"/>
</root>
其中配置各个配置项解释如下:
- appName:自定义应用名称
- redisHost:redis地址,哨兵模式多个用逗号隔开
- redisAuth:redis密码
3.2.4 检测
访问 ip:8891
即可。同时启动整合后的springBoot项目。
页面统一管理整合进系统的日志,同时可以通过上放查询条件查询。
3.2.5 时时日志
可以连接具体服务,查看时时日志。
3.2.6 错误日志统计
可以查看错误日志的数量与类。
3.2.7 错误报警
在一定时间产生的错误可以通过钉钉、企业微信等发起通知。 钩子为机器人的Webhook,请自行编写。成功后的情况如下。
本文只介绍redis版本,如需要kafka版本,请自行参考文档:https://gitee.com/plumeorg/plumelog/blob/master/FASTSTART.md