个人学习springboot

Plumelog分布式日志组件使用说明书

2021-07-26  本文已影响0人  wangfy

系统介绍

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

架构

架构图.png

效果图

登录.png 日志查询.png 错误统计.png 系统管理.png 报警设置.png 报警记录.png 报警机器人.png

使用说明

服务端安装

安装步骤

  1. 第一步,安装redis或者kafka(一般公司redis足够),redis官网:https://redis.io;kafka官网:http://kafka.apache.org
  2. 第二步,安装elasticsearch,elasticsearch官网下载地址:https://www.elastic.co/cn/downloads/past-releases
  3. 第三步,下载安装包,plume-server下载地址:https://gitee.com/plumeorg/plumelog/releases,也可以使用内部提供好的
  4. 第四步,配置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

提升性能推荐参数配置方法

plumelog.es.shards=5
plumelog.es.replicas=0
plumelog.es.refresh.interval=30s
plumelog.es.indexType.model=day
plumelog.es.shards=5
plumelog.es.replicas=0
plumelog.es.refresh.interval=30s
plumelog.es.indexType.model=hour
plumelog.es.shards=10
plumelog.es.replicas=0
plumelog.es.refresh.interval=30s
plumelog.es.indexType.model=hour
plumelog.es.shards=10
plumelog.es.replicas=1
plumelog.es.refresh.interval=30s
plumelog.es.indexType.model=hour
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的建议先熟悉下。

使用注意事项,链路追踪模块会产生大量链路日志,并发高的模块不要过度使用,特别是全局打点。

手动打点和全局打点不能同时使用用了全局打点,手动的会失效。

  1. 引入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>
  1. 手动打点,需要在记录的方法上加入@Trace就可以记录链路日志了
@Trace
@GetMapping("/hello")
public String hello() {
    process1();
    process2();
    try {
        // 这里模拟一个算术异常
        int i = 1 / 0;
    } catch (Exception e) {
        log.error("测试异常", e);
    }
    return "hello";
}
  1. 全局打点,需要自定义切入点,当定义全局打点时,手动打点就会失效
@Aspect
@Component
public class AspectConfig extends AbstractAspect {
    @Around("within(com.xxxx..*))") //这边写自己的包的路径
    public Object around(JoinPoint joinPoint) {
        return aroundExecute(joinPoint);
    }
}
  1. 如果不想再自己的控制台或者文件输出里看到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

含义说明(参考):

说明:报警记录里边为报警历史记录,点击可以直接连接到错误内容。

上一篇 下一篇

猜你喜欢

热点阅读