百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Plumelog一个简单易用的java分布式日志组件

mhr18 2024-12-01 09:11 13 浏览 0 评论

一.系统介绍

  1. 无入侵的互联网分布式日志系统,基于log4j、log4j2、logback搜集日志,设置链路ID,方便查询关联日志
  2. 基于elasticsearch作为查询引擎
  3. 高吞吐,查询效率高
  4. 全程不占应用程序本地磁盘空间,免维护;对于项目透明,不影响项目本身运行
  5. 无需修改老项目,引入直接使用,支持dubbo,支持springcloud

二.架构

  • plumelog-core 核心组件包含日志搜集端,负责搜集日志并推送到kafka,redis等队列
  • plumelog-server 负责把队列中的日志日志异步写入到elasticsearch
  • plumelog-ui 前端展示,日志查询界面
  • plumelog-demo 基于springboot的使用案例

三.使用方法

前提:kafka或者redis 和 elasticsearch(版本6.8以上最好) 自行安装完毕,版本兼容已经做了,理论不用考虑ES版本

  1. 打包
  • maven deploy -DskipTests 上传包到自己的私服私服地址到plumelog/pom.xml改
       <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          <distribution.repository.url>http://172.16.249.94:4000</distribution.repository.url>
        </properties>

(1)安装

1.安装 redis 或者 kafka(一般公司redis足够) redis 官网:https://redis.io kafka:http://kafka.apache.org

2.安装 elasticsearch(推荐6.8) 6.8官网下载地址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-8-10

3.下载安装包,plumelog-ui和plumelog-server 下载地址:https://gitee.com/frankchenlong/plumelog/releases

备注:3.1版本以后UI和server合并,plumelog-ui这个项目可以不用部署

4.配置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/**
   
   #值为4种 redis,kafka,rest,restServer
   #redis 表示用redis当队列
   #kafka 表示用kafka当队列
   #rest 表示从rest接口取日志
   #restServer 表示作为rest接口服务器启动
   #ui 表示单独作为ui启动
   plumelog.model=redis
   
   #如果使用kafka,启用下面配置
   #plumelog.kafka.kafkaHosts=127.0.0.1:9092,127.0.0.1:9092,127.0.0.1:9092
   #plumelog.kafka.kafkaGroupName=logConsumer
   
   #redis配置,3.0版本必须配置redis地址,因为需要监控报警
   plumelog.redis.redisHost=127.0.0.1:6379
   #如果使用redis有密码,启用下面配置
   plumelog.redis.redisPassWord=!jkl1234
   
   #如果使用rest,启用下面配置
   #plumelog.rest.restUrl=http://127.0.0.1:8891/getlog
   #plumelog.rest.restUserName=plumelog
   #plumelog.rest.restPassWord=123456
   
   #elasticsearch相关配置
   plumelog.es.esHosts=127.0.0.1:9200
   #ES7.*已经去除了索引type字段,所以如果是es7不用配置这个,7.*以下不配置这个会报错
   #plumelog.es.indexType=plumelog
   #ES设置密码,启用下面配置
   plumelog.es.userName=elastic
   plumelog.es.passWord=123456
   
   #单次拉取日志条数
   plumelog.maxSendSize=5000
   #拉取时间间隔,kafka不生效
   plumelog.interval=1000
   
   #plumelog-ui的地址 如果不配置,报警信息里不可以点连接
   plumelog.ui.url=http://127.0.0.1:8080
   
   #管理密码,手动删除日志的时候需要输入的密码
   admin.password=123456
   #日志保留天数,配置0或者不配置默认永久保留
   admin.log.keepDays=15

5.配置plume-ui(3.1后合并到server),并启动,默认端口8989

备注:3.1版本以后UI和server合并,这个项目可以不用部署

配置文件 plumelog-ui/application.properties 详解:

   spring.application.name=plumelog-ui
   server.port=8989
   spring.thymeleaf.mode=LEGACYHTML5
   spring.mvc.view.prefix=classpath:/templates/
   spring.mvc.view.suffix=.html
   spring.mvc.static-path-pattern=/plumelog/**
   
   
   #elasticsearch地址
   plumelog.es.esHosts=127.0.0.1:9200
   #ES如果有密码,启用下面配置
   #plumelog.es.userName=elastic
   #plumelog.es.passWord=easylog123456

   #redis配置,3.0版本必须配置redis地址,因为需要监控报警
   plumelog.server.redis.redisHost=127.0.0.1:6379
   #如果使用redis有密码,启用下面配置
   #plumelog.server.redis.redisPassWord=123456

   #管理密码,手动删除日志的时候需要输入的密码
   admin.password=123456
   #日志保留天数,配置0或者不配置默认永久保留
   admin.log.keepDays=15

(2)项目使用

性能排名,log4j2>logback>log4j 如果您的项目没有特殊需求,建议用log4j2

(1)如果项目使用的log4j,引入

   <dependency>
       <groupId>com.plumelog</groupId>
       <artifactId>plumelog-log4j</artifactId>
       <version>3.1</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做为中间件
    #<!-- 字段说明 -->
    #<!-- appName:应用名称 -->
    #<!-- kafkaHosts:kafka集群地址 -->
    #<!-- runModel:runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1-->
    log4j.appender.L=com.plumelog.core.appender.KafkaAppender
    #appName系统的名称(自己定义就好)
    log4j.appender.L.appName=plumelog
    log4j.appender.L.kafkaHosts=172.16.247.143:9092,172.16.247.60:9092,172.16.247.64:9092
    #redis做为中间件
    #字段说明
    #<!-- appName:应用名称 -->
    #<!-- redisHost:redis地址 -->
    #<!-- redisPort:redis端口号 不配置,默认使用6379-->
    #<!-- runModel:runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1- -->
    log4j.appender.L=com.plumelog.log4j.appender.RedisAppender
    log4j.appender.L.appName=plumelog
    log4j.appender.L.redisHost=172.16.249.72
    log4j.appender.L.redisPort=6379
    #redis没有密码这一项为空或者不需要
    #log4j.appender.L.redisAuth=123456

同理如果使用logback,和log4j2配置如下

logback

  • 引入
   <dependency>
       <groupId>com.plumelog</groupId>
       <artifactId>plumelog-logback</artifactId>
       <version>3.1</version>
   </dependency>
  • 配置
 <appenders>
    <!--使用redis启用下面配置-->
    <!-- 字段说明 -->
    <!-- appName:应用名称 -->
    <!-- redisHost:redis地址 -->
    <!-- redisPort:redis端口号 不配置,默认使用6379-->
    <!-- runModel:runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1- -->
    <!-- expand:整合其他链路插件,启用这个字段 expand=“sleuth” 表示整合springcloud.sleuth- -->
    <appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
        <appName>plumelog</appName>
        <redisHost>172.16.249.72</redisHost>
        <redisAuth>123456</redisAuth>
        <redisPort>6379</redisPort>
    </appender>
   <!-- 使用kafka启用下面配置 -->
   <!-- 字段说明 -->
   <!-- appName:应用名称 -->
   <!-- kafkaHosts:kafka集群地址 -->
   <!-- runModel:runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1- -->
   <!-- expand:整合其他链路插件,启用下面配置 sleuth表示整合springcloud.sleuth- -->
    <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

  • 引入
   <dependency>
       <groupId>com.plumelog</groupId>
       <artifactId>plumelog-log4j2</artifactId>
       <version>3.1</version>
   </dependency>       
  • 配置
 <appenders>
   <!-- 使用kafka启用下面配置 -->
   <!-- 字段说明 -->
   <!-- appName:应用名称 -->
   <!-- kafkaHosts:kafka集群地址 -->
   <!-- runModel:runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1- -->
   <!-- expand:整合其他链路插件,启用下面配置 sleuth表示整合springcloud.sleuth- -->
  <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启用下面配置-->
     <!-- 字段说明 -->
     <!-- appName:应用名称 -->
     <!-- redisHost:redis地址 -->
     <!-- redisPort:redis端口号 不配置,默认使用6379-->
     <!-- runModel:runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1- -->
     <!-- expand:整合其他链路插件,启用这个字段 expand=“sleuth” 表示整合springcloud.sleuth- -->
  <RedisAppender name="redisAppender" appName="plumelog" redisHost="172.16.249.72" redisPort="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>

(3)示例(所有的列子都在plumelog-demo里面)

配置详解

RedisAppender

字段值用途appName自定义应用名称redisHostredis地址redisPortredis端口号runModel1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1expand整合其他链路插件,启用这个字段 expand=“sleuth” 表示整合springcloud.sleuthmaxCount批量提交日志数量,默认100

KafkaAppender

字段值用途appName自定义应用名称kafkaHostskafka集群地址,用逗号隔开runModel1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1expand整合其他链路插件,启用这个字段 expand=“sleuth” 表示整合springcloud.sleuthmaxCount批量提交日志数量,默认100

  • 普通日志使用要想产生traceID,需要再拦截器里增加,如下:(也可以加载过滤器里,如果是定时任务放在定时任务的最前端)
        @Component
        public class Interceptor extends HandlerInterceptorAdapter{
            private IdWorker worker = new IdWorker(1,1,1);//雪花算法,这边不一定要用这个生成如果用这个,不通的项目应用参数不要一样,否则会重复
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                TraceId.logTraceID.set(String.valueOf(worker.nextId()));//设置TraceID值,不埋此点链路ID就没有
                return true;
            }
        }

spring cloud 项目引入sleuth

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-sleuth</artifactId>
            </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("子线程日志展示");
          });
  • 错误报警说明在ui的报警管理里配置报警规则:字段说明:1.应用名称 需要错误报警的应用名称(appName)2.模块名称 需要错误报警的className3.接收人 填手机号码,所有人填写ALL4.钉钉钩子地址 钉钉群机器人webhook地址5.错误数量 错误累计超过多少条报警6.时间间隔 错误在多少秒内累计到上面错误数量开始报警报警记录里为报警历史记录,点击可以直接连接到错误内容修饰Runnable和Callable
        private static ThreadPoolExecutor threadPoolExecutor= ThreadPoolUtil.getPool(4, 8, 5000);
        
        threadPoolExecutor.execute(TtlRunnable.get(() -> {
                   TraceId.logTraceID.get();
                   logger.info("tankSay =》我是子线程的日志!{}", TraceId.logTraceID.get());
         }));

相关推荐

redis 7.4.3更新!安全修复+性能优化全解析

一、Redis是什么?为什么选择它?Redis(RemoteDictionaryServer)是一款开源的高性能内存键值数据库,支持持久化、多数据结构(如字符串、哈希、列表等),广泛应用于缓存、消...

C# 读写Redis数据库的简单例子

CSRedis是一个基于C#的Redis客户端库,它提供了与Redis服务器进行交互的功能。它是一个轻量级、高性能的库,易于使用和集成到C#应用程序中。您可以使用NuGet包管理器或使用以下命令行命令...

十年之重修Redis原理

弱小和无知并不是生存的障碍,傲慢才是。--------面试者总结Redis可能都用过,但是从来没有理解过,就像一个熟悉的陌生人,本文主要讲述了Redis基本类型的使用、数据结构、持久化、单线程模型...

高频L2行情数据Redis存储架构设计(含C++实现代码)

一、Redis核心设计原则内存高效:优化数据结构,减少内存占用低延迟访问:单次操作≤0.1ms响应时间数据完整性:完整存储所有L2字段实时订阅:支持多客户端实时数据推送持久化策略:RDB+AOF保障数...

Magic-Boot开源引擎:零代码玩转企业级开发,效率暴涨!

一、项目介绍基于magic-api搭建的快速开发平台,前端采用Vue3+naive-ui最新版本搭建,依赖较少,运行速度快。对常用组件进行封装。利用Vue3的@vue/compiler-sfc单文...

项目不行简历拉胯?3招教你从面试陪跑逆袭大厂offer!

项目不行简历拉胯?3招教你从面试陪跑逆袭大厂offer!老铁们!是不是每次面试完都感觉自己像被大厂面试官婉拒的渣男?明明刷了三个月题库,背熟八股文,结果一被问项目就支支吾吾,简历写得像大学生课程设计?...

谷歌云平台:开发者部署超120个开源包

从国外相关报道了解,Google与Bitnami合作为Google云平台增加了一个新的功能,为了方便开发人员快捷部署程序,提供了120余款开源应用程序云平台的支持。这些应用程序其中包括了WordPre...

知名互联网公司和程序员都看好的数据库是什么?

2017年数据库领域的最大趋势是什么?什么是最热的数据处理技术?学什么数据库最有前途?程序员们普遍不喜欢的数据库是什么?本文都会一一揭秘。大数据时代,数据库的选择备受关注,此前本号就曾揭秘国内知名互联...

腾讯云发布云存储MongoDB服务

近日,著名安全专家兼Shodan搜索引擎的创建者JohnMatherly发现,目前至少有35000个受影响的MongoDB数据库暴露在互联网上,它们所包含的数据暴露在网络攻击风险之中。据估计,将近6...

已跪,Java全能笔记爆火,分布式/开源框架/微服务/性能调优全有

前言程序员,立之根本还是技术,一个程序员的好坏,虽然不能完全用技术强弱来判断,但是技术水平一定是基础,技术差的程序员只能CRUD,技术不深的程序员也成不了架构师。程序员对于技术的掌握,除了从了解-熟悉...

面试官:举个你解决冲突的例子?别怂!用这个套路……

面试官:举个你解决冲突的例子?别怂!用这个套路……最近收到粉丝私信,说被问到:团队技术方案有分歧怎么办?当场大脑宕机……兄弟!这不是送命题,是展示你情商+技术判断力的王炸题!今天教你们3招,用真实案例...

面试碰到MongoDB?莫慌,跟面试官这样吹MongoDB 复制集

推荐阅读:吊打MySQL:21性能优化实践+学习导图+55面试+笔记+20高频知识点阿里一线架构师分享的技术图谱,进阶加薪全靠它十面字节跳动,依旧空手而归,我该放弃吗?文末会分享一些MongoDB的学...

SpringBoot集成扩展-访问NoSQL数据库之Redis和MongoDB!

与关系型数据库一样,SpringBoot也提供了对NoSQL数据库的集成扩展,如对Redis和MongoDB等数据库的操作。通过默认配置即可使用RedisTemplate和MongoTemplate...

Java程序员找工作总卡项目关?

Java程序员找工作总卡项目关?3招教你用真实经历写出HR抢着要的简历!各位Java老哥,最近刷招聘软件是不是手都划酸了?简历投出去石沉大海,面试邀请却总在飞别人的简历?上周有个兄弟,13年经验投了5...

Java多租户SaaS系统实现方案

嗯,用户问的是Java通过租户id实现的SaaS方案。首先,我需要理解用户的需求。SaaS,也就是软件即服务,通常是指多租户的架构,每个租户的数据需要隔离。用户可能想知道如何在Java中利用租户ID来...

取消回复欢迎 发表评论: