龙空技术网

Gitee精选 | Plumelog-Java分布式日志组件

GitHub精选 1497

前言:

今天看官们对“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分布式项目案例分享报告