前言:
今天看官们对“java分布式项目案例分享报告”都比较关怀,同学们都想要分析一些“java分布式项目案例分享报告”的相关文章。那么小编也在网络上搜集了一些有关“java分布式项目案例分享报告””的相关知识,希望大家能喜欢,大家一起来学习一下吧!《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是 Plumelog一个简单易用的 Java分布式日志组件。
系统介绍无代码入侵的分布式日志系统,基于log4j、log4j2、logback搜集日志,设置链路ID,方便查询关联日志基于elasticsearch作为查询引擎高吞吐,查询效率高全程不占应用程序本地磁盘空间,免维护;对于项目透明,不影响项目本身运行无需修改老项目,引入直接使用,支持dubbo,支持springcloud系统架构plumelog-core 核心组件包含日志搜集端,负责搜集日志并推送到kafka,redis等队列plumelog-server 负责把队列中的日志日志异步写入到elasticsearchplumelog-demo 基于springboot的使用案例下面是全功能图,红色部分是4.0内容,目前开发中使用
一、服务端安装
第一步:安装 redis 或者 kafka(一般公司redis足够)
第二步:安装 elasticsearch
第三步:下载安装包,plumelog-server 下载地址:
备注:3.1版本以后UI和server合并,plumelog-ui这个项目可以不用部署
第四步:配置plumelog-server,并启动
第五步:后台查询
更多查询内容:
服务端配置文件 plumelog-server/application.properties 详解
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/** #值为6种 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 #解压缩模式,开启后不消费非压缩的队列,如果开启压缩,客户端也要配置开启压缩否则不消费 #plumelog.redis.compressor=true #队列redis,3.3版本把队列redis独立出来,方便不用的应用用不通的队列,如果是集群模式用逗号隔开 plumelog.queue.redis.redisHost=127.0.0.1:6379 #如果使用redis有密码,启用下面配置 #plumelog.queue.redis.redisPassWord=plumelog #plumelog.queue.redis.redisDb=0 #哨兵模式需要填写masterName #plumelog.queue.redis.sentinel.masterName=plumelog #redis单机模式和kafka模式必须配置管理redis地址,redis集群模式不需要配置管理redis地址配置了也不起作用 plumelog.redis.redisHost=127.0.0.1:6379 #如果使用redis有密码,启用下面配置 #plumelog.redis.redisPassWord=plumelog #如果使用rest,启用下面配置 #plumelog.rest.restUrl= #plumelog.rest.restUserName=plumelog #plumelog.rest.restPassWord=123456 #elasticsearch相关配置,host多个用逗号隔开 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表示按照小时,如果每天日志量超过了500G建议启动小时模式 plumelog.es.indexType.model=day #指定索引建立的时区 plumelog.es.indexType.zoneId=GMT+8 #ES设置密码,启用下面配置 #plumelog.es.userName=elastic #plumelog.es.passWord=123456 #是否信任自签证书 #plumelog.es.trustSelfSigned=true #是否hostname验证 #plumelog.es.hostnameVerification=false #单次拉取日志条数 plumelog.maxSendSize=100 #拉取时间间隔,kafka不生效 plumelog.interval=200 #plumelog-ui的地址 如果不配置,报警信息里不可以点连接 plumelog.ui.url= #管理密码,手动删除日志的时候需要输入的密码 admin.password=123456 #日志保留天数,配置0或者不配置默认永久保留 admin.log.keepDays=30 #链路保留天数,配置0或者不配置默认永久保留 admin.log.trace.keepDays=30 #登录用户名密码,为空没有登录界面 login.username=admin login.password=admin
二、客户端使用
客户端在项目使用,非maven项目下载依赖包( )放在自己的lib下面直接使用,去除重复的包即可使用,然后配置log4j就可以搜集日志了。
推荐使用logback,特别是springboot,springcloud项目;注意:3.2版本logback有bug,请使用3.2.1修复版本或者以上版本。
引入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
客户端配置详解
字段值
用途
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
traceID生成配置
非springboot,cloud项目要想产生traceID,需要在拦截器里增加,如下:(也可以加载过滤器里(com.plumelog.core.TraceIdFilter),如果是定时任务,监听类的放在定时任务的最前端)
@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; } } //注解配置filter示例 @Bean public FilterRegistrationBean filterRegistrationBean1() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(initCustomFilter()); filterRegistrationBean.addUrlPatterns("/*"); filterRegistrationBean.setOrder(Integer.MIN_VALUE); return filterRegistrationBean; } @Bean public Filter initCustomFilter() { return new TraceIdFilter(); }
spring boot,spring cloud 项目引入sleuth,项目之间采用feign调用的话,可以自己实现跨服务传递traceId
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> <version>2.2.7.RELEASE</version> </dependency>
TraceId跨线程传递
如果不使用线程池,不用特殊处理,如果使用线程池,有两种使用方式,(plumelog-demo也有)
修饰线程池
private static ExecutorService executorService = TtlExecutors.getTtlExecutorService( new ThreadPoolExecutor(8, 8,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>())); //省去每次Runnable和Callable传入线程池时的修饰,这个逻辑可以在线程池中完成 executorService.execute(() -> { logger.info("子线程日志展示"); });
修饰Runnable和Callable
private static ThreadPoolExecutor threadPoolExecutor= ThreadPoolUtil.getPool(4, 8, 5000); threadPoolExecutor.execute(TtlRunnable.get(() -> { TraceId.logTraceID.get(); logger.info("tankSay =》我是子线程的日志!{}", TraceId.logTraceID.get()); }));
Gitee地址:
标签: #java分布式项目案例分享报告