Plumelog分布式日志组件使用说明书
2021-07-26 本文已影响0人
wangfy
系统介绍
- 无入侵的分布式日志系统,基于log4j, log4j2, logback搜集日志,设置链路ID,方便查询关联日志。
- 基于elasticsearch作为查询引擎。
- 高吞吐,查询效率高。
- 全程不占应用程序本地磁盘空间,免维护;对于项目透明,不影响项目本身运行。
- 无需修改老项目,引入直接使用,支持dubbo和springcloud。
架构
架构图.png- plumelog-core 核心组件包含日志搜集端,负责搜集日志并推送到redis/kafka等队列中
- plumelog-server 负责把队列中的日志异步写入到elasticsearch
效果图
登录.png 日志查询.png 错误统计.png 系统管理.png 报警设置.png 报警记录.png 报警机器人.png使用说明
服务端安装
安装步骤
- 第一步,安装redis或者kafka(一般公司redis足够),redis官网:https://redis.io;kafka官网:http://kafka.apache.org
- 第二步,安装elasticsearch,elasticsearch官网下载地址:https://www.elastic.co/cn/downloads/past-releases
- 第三步,下载安装包,plume-server下载地址:https://gitee.com/plumeorg/plumelog/releases,也可以使用内部提供好的
- 第四步,配置plume-server,启动
配置文件详解
spring.application.name=plumelog_server
spring.profiles.active=test-confidential
server.port=8891
spring.thymeleaf.mode=LEGACYHTML5
spring.mvc.view.prefix=classpath:/templates/
spring.mvc.view.suffix=.html
spring.mvc.static-path-pattern=/plumelog/**
#值为4种 redis,kafka,rest,restServer,redisCluster,redisSentinel
#redis 表示用redis当队列
#redisCluster 表示用redisCluster当队列
#redisSentinel 表示用redisSentinel当队列
#kafka 表示用kafka当队列
#rest 表示从rest接口取日志
#restServer 表示作为rest接口服务器启动
#ui 表示单独作为ui启动
plumelog.model=redis
#如果使用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集群模式
plumelog.queue.redis.redisHost=127.0.0.1:6379
#如果使用redis有密码,启用下面配置
#plumelog.queue.redis.redisPassWord=123456
#plumelog.queue.redis.redisDb=0
#管理端redis地址
plumelog.redis.redisHost=127.0.0.1:6379
#如果使用redis有密码,启用下面配置
#plumelog.redis.redisPassWord=123456
#plumelog.queue.redis.redisDb=0
#如果使用rest,启用下面配置
#plumelog.rest.restUrl=http://127.0.0.1:8891/getlog
#plumelog.rest.restUserName=plumelog
#plumelog.rest.restPassWord=123456
#redis解压缩模式,开启后不消费非压缩的队列
#plumelog.redis.compressor=true
#elasticsearch相关配置,Hosts支持携带协议,如:http、https
plumelog.es.esHosts=127.0.0.1:9200
#ES7.*已经去除了索引type字段,所以如果是es7不用配置这个,7.*以下不配置这个会报错
#plumelog.es.indexType=plumelog
plumelog.es.shards=5
plumelog.es.replicas=1
plumelog.es.refresh.interval=30s
#日志索引建立方式day表示按天、hour表示按照小时
plumelog.es.indexType.model=day
#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://127.0.0.1:8891
#管理密码,手动删除日志的时候需要输入的密码
admin.password=123456
#日志保留天数,配置0或者不配置默认永久保留
admin.log.keepDays=30
#链路保留天数,配置0或者不配置默认永久保留
admin.log.trace.keepDays=30
#登录配置,配置后会有登录界面
login.username=wangfeiyong
login.password=123456
提升性能推荐参数配置方法
- 单日日志体量在50G以内,并使用的SSD硬盘
plumelog.es.shards=5
plumelog.es.replicas=0
plumelog.es.refresh.interval=30s
plumelog.es.indexType.model=day
- 单日日志体量在50G以上,并使用的机械硬盘
plumelog.es.shards=5
plumelog.es.replicas=0
plumelog.es.refresh.interval=30s
plumelog.es.indexType.model=hour
- 单日日志体量在100G以上,并使用的机械硬盘
plumelog.es.shards=10
plumelog.es.replicas=0
plumelog.es.refresh.interval=30s
plumelog.es.indexType.model=hour
- 单日日志体量在1000G以上,并使用的SSD硬盘,这个配置可以跑到10T一天以上都没问题
plumelog.es.shards=10
plumelog.es.replicas=1
plumelog.es.refresh.interval=30s
plumelog.es.indexType.model=hour
- plumelog.es.shards的增加和hour模式下需要调整ES集群的最大分片数
PUT /_cluster/settings
{
"persistent": {
"cluster": {
"max_shards_per_node":100000
}
}
}
客户端使用
引入依赖和配置
log4j
引入Maven依赖
<dependency>
<groupId>com.plumelog</groupId>
<artifactId>plumelog-log4j</artifactId>
<version>3.4.2</version>
</dependency>
配置log4j配置文件,增加下面这个Appender,示例如下:
log4j.rootLogger = INFO,stdout,L
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} [%c.%t]%n%m%n
#kafka做为中间件
log4j.appender.L=com.plumelog.log4j.appender.KafkaAppender
#appName系统的名称(自己定义就好)
log4j.appender.L.appName=plumelog
log4j.appender.L.env=${spring.profiles.active}
log4j.appender.L.kafkaHosts=172.16.247.143:9092,172.16.247.60:9092,172.16.247.64:9092
#redis做为中间件
log4j.appender.L=com.plumelog.log4j.appender.RedisAppender
log4j.appender.L.appName=plumelog
log4j.appender.L.env=${spring.profiles.active}
log4j.appender.L.redisHost=172.16.249.72:6379
#redis没有密码这一项为空或者不需要
#log4j.appender.L.redisAuth=123456
logback
引入Maven依赖
<dependency>
<groupId>com.plumelog</groupId>
<artifactId>plumelog-logback</artifactId>
<version>3.4.2</version>
</dependency>
配置
<appenders>
<!--使用redis启用下面配置-->
<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
<appName>plumelog</appName>
<redisHost>172.16.249.72:6379</redisHost>
<redisAuth>123456</redisAuth>
</appender>
<!-- 使用kafka启用下面配置 -->
<appender name="plumelog" class="com.plumelog.logback.appender.KafkaAppender">
<appName>plumelog</appName
<kafkaHosts>172.16.247.143:9092,172.16.247.60:9092,172.16.247.64:9092</kafkaHosts>
</appender>
</appenders>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="plumelog" />
</root>
log4j2
引入Maven依赖
<dependency>
<groupId>com.plumelog</groupId>
<artifactId>plumelog-log4j2</artifactId>
<version>3.4.2</version>
</dependency>
配置
<appenders>
<!-- 使用kafka启用下面配置 -->
<KafkaAppender name="kafkaAppender" appName="plumelog" kafkaHosts="172.16.247.143:9092,172.16.247.60:9092,172.16.247.64:9092" >
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%-5p] {%F:%L} - %m%n" />
</KafkaAppender>
<!--使用redis启用下面配置-->
<RedisAppender name="redisAppender" appName="plumelog" redisHost="172.16.249.72:6379" redisAuth="123456">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%-5p] {%F:%L} - %m%n" />
</RedisAppender>
</appenders>
<loggers>
<root level="INFO">
<appender-ref ref="redisAppender"/>
</root>
</loggers>
配置文件详解
RedisAppender
字段值 | 用途 |
---|---|
appName | 自定义应用名称 |
redisHost | redis地址 |
redisPort | redis端口号,3.4版本后可以不用配置可以配置在host上用冒号结尾 |
redisAuth | redis密码 |
redisDb | redis db |
model | (3.4)redis三种模式(standalone,cluster,sentinel),不配置默认standalone |
runModel | 1表示最高性能模式;2表示低性能模式,但是2可以获取更多信息,不配置默认为1 |
maxCount | (3.1)批量提交日志数量,默认100 |
logQueueSize | (3.1.2)缓冲队列数量大小,默认10000,太小可能丢日志,太大容易内存溢出,根据实际情况,如果项目内存足够可以设置到100000+ |
compressor | (3.4)是否开启日志压缩,默认false |
env | (3.4.2)环境 默认是default |
KafkaAppender
字段值 | 用途 |
---|---|
appName | 自定义应用名称 |
kafkaHosts | kafka集群地址,用逗号隔开 |
runModel | 1表示最高性能模式;2表示低性能模式,但是2可以获取更多信息,不配置默认为1 |
maxCount | (3.1)批量提交日志数量,默认100 |
logQueueSize | (3.1.2)缓冲队列数量大小,默认10000,太小可能丢日志,太大容易内存溢出,根据实际情况,如果项目内存足够可以设置到100000+ |
compressor | (3.4)是否开启日志压缩,默认false |
env | (3.4.2)环境 默认是default |
追踪码生成配置
filter方式(推荐)
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(initCustomFilter());
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
@Bean
public Filter initCustomFilter() {
return new TraceIdFilter();
}
interceptor方式
@Component
public class Interceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
String traceid= uuid.substring(uuid.length() - 7);
TraceId.logTraceID.set(traceid); //设置TraceID值,不埋此点链路ID就没有
return true;
}
}
链路追踪配置
注意:如果没有配置此项,界面上就没有链路信息显示。
本模块原理是利用springAOP切面产生链路日志,核心是配置springAOP,配置之前不熟悉springAOP的建议先熟悉下。
使用注意事项,链路追踪模块会产生大量链路日志,并发高的模块不要过度使用,特别是全局打点。
手动打点和全局打点不能同时使用用了全局打点,手动的会失效。
- 引入Maven依赖
<dependency>
<groupId>com.plumelog</groupId>
<artifactId>plumelog-trace</artifactId>
<version>3.4.2</version>
</dependency>
<!-- 引入aop -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.1.11.RELEASE</version>
<scope>provided</scope>
<!-- scope为provided 是为了不与使用者的版本冲突 -->
</dependency>
- 手动打点,需要在记录的方法上加入@Trace就可以记录链路日志了
@Trace
@GetMapping("/hello")
public String hello() {
process1();
process2();
try {
// 这里模拟一个算术异常
int i = 1 / 0;
} catch (Exception e) {
log.error("测试异常", e);
}
return "hello";
}
- 全局打点,需要自定义切入点,当定义全局打点时,手动打点就会失效
@Aspect
@Component
public class AspectConfig extends AbstractAspect {
@Around("within(com.xxxx..*))") //这边写自己的包的路径
public Object around(JoinPoint joinPoint) {
return aroundExecute(joinPoint);
}
}
- 如果不想再自己的控制台或者文件输出里看到trace日志可以通过添加过滤器过滤掉,logback的例子如下
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 此过滤器过滤掉所有的trace日志,3.4.1版本logback自带的过滤类 -->
<filter class="com.plumelog.logback.util.FilterSyncLogger">
<level>info</level>
<filterPackage>com.plumelog.trace.aspect.AbstractAspect</filterPackage>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
异常报警推送
飞书平台
添加群机器人
步骤一:点击【设置】按钮,选择【群机器人】
飞书添加群机器人操作1.png步骤二:点击【添加机器人】按钮
飞书添加群机器人操作2.png步骤三:选择【自定义机器人】,点击【添加】按钮
飞书添加群机器人操作3.png步骤四:分别填写机器人名称和描述信息,点击【下一步】按钮
飞书添加群机器人操作4.png步骤五:复制webhook地址,安全设置和设置部分根据自己需要配置,是可选部分,点击【完成】按钮
飞书添加群机器人操作5.png平台配置
报警配置.png含义说明(参考):
- 应用名称:需要错误报警的应用名称
- 应用环境:需要错误报警的应用环境,不填写默认为default
- 模块名称:需要报警的className
- 接收者:填写手机号,所有人填写all
- 钩子地址:群机器人webhook地址
- 错误数量:错误累计超过多少天报警
- 时间间隔:错误在多少秒内累计到上面错误数量开始报警
说明:报警记录里边为报警历史记录,点击可以直接连接到错误内容。