一.简介

plumeLog是一个简单易用的java日志系统。其在日志收集方面做的很好,但在链路追踪方面只是简单集成,如果对链路追踪更感兴趣,可以参考另一个项目skywalking

1.1 特点:

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

1.2 架构

avatar

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

1.3 项目&文档地址

项目地址

gitee地址:https://gitee.com/plumeorg/plumelog?_from=gitee_search

github地址:https://github.com/fayechenlong/plumelog

文档地址:

使用文档:https://gitee.com/plumeorg/plumelog/blob/master/FASTSTART.md

测试地址:

  • 查询界面地址:http://demo.plumelog.com 用户名:admin 密码:admin (测试服务器配置比较低大家简单体验即可)
  • 访问这个地址产生测试log数据:http://log.plumelog.com/index?data=1234 data参数自己随便传,传什么打印什么

二. 下载配置项目

2.1 安装ElasticSearch

2.2 安装PlumeLog

首先从gitee上下载plumeLog-server(新版已经把plumelog-serverplumelog-ui合并,因此只需要下载plumelog-server即可),打开项目,到plumelog-server模块的application.properties中进行配置(由于项目日志吞吐量不大,而作者在文档中说明,redis已足够满足需求,超大项目才需要使用到kafka,因此此处我选用redis作为中间件)

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=39.99.241.168:41000
#plumelog.kafka.kafkaGroupName=logConsumer

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

#如果使用rest,启用下面配置
#plumelog.rest.restUrl=http://127.0.0.1:8891/getlog
#plumelog.rest.restUserName=plumelog
#plumelog.rest.restPassWord=123456

#elasticsearch相关配置
#ES
plumelog.es.esHosts=127.0.0.1:9200
#ES7.*已经去除了索引type字段,所以如果是es7不用配置这个,7.*以下不配置这个会报错
#plumelog.es.indexType=plumelog
#ES设置密码,启用下面配置
#plumelog.es.userName=elastic
#plumelog.es.passWord=FLMOaqUGamMNkZ2mkJiY

#单次拉取日志条数
plumelog.maxSendSize=5000
#拉取时间间隔,kafka不生效
plumelog.interval=1000

#plumelog-ui的地址 如果不配置,报警信息里不可以点连接
plumelog.ui.url=http://127.0.0.1:8891
#plumelog.ui.url=http://39.99.241.168:8891
#plumelog.ui.url=http://116.63.170.231:8891

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

这样的话,server就配置好了。

由于主项目我们使用的是logback,因此在主项目引入jar包

   <dependency>
       <groupId>com.plumelog</groupId>
       <artifactId>plumelog-logback</artifactId>
       <version>3.4.2</version>
   </dependency>

如果需要链路追踪功能则需要引入以下依赖

<sleuth-version>2.2.4.RELEASE</sleuth-version>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
    <version>${sleuth-version}</version>
</dependency>

然后在项目的logback-spring.xml中加入配置,

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <contextName>spring-boot-logging</contextName>
    <springProperty scope="context" name="redis.host" source="spring.redis.host"/>
    <springProperty scope="context" name="redis.port" source="spring.redis.port"/>
    <springProperty scope="context" name="redis.password" source="spring.redis.password"/>
    <springProperty scope="context" name="application.name" source="spring.application.name"/>
    
    <appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
        <appName>${application.name}</appName>
        <redisHost>${redis.host}</redisHost>
        <redisAuth>${redis.password}</redisAuth>
        <redisPort>${redis.port}</redisPort>
        <!--    这个是链路追踪使用的类型,目前只支持sleuth,不使用链路追踪可以不配置    -->
        <expand>sleuth</expand>
    </appender>

    <root level="info">
	 <appender-ref ref="plumelog"/>
    </root>

</configuration>

如果需要做链路追踪的话,则需要配置请求打点,配置如下

import com.plumelog.core.TraceId;
import com.plumelog.core.util.IdWorker;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;

/**
 *
 * PlumeLog请求打点Utils
 *
 */
public class PlumeLogUtils {
    static IdWorker worker = new IdWorker(1, 1, 1);

    /**
     * 请求打点(为每次请求加上链路码)
     *
     * @param httpServletRequest
     */
    public static void setTraceIdInRequest(HttpServletRequest httpServletRequest) {
        String traceId = httpServletRequest.getHeader("TraceId");
        if (StringUtils.isEmpty(traceId)) {
            TraceId.logTraceID.set(String.valueOf(worker.nextId()));
        } else {
            TraceId.logTraceID.set(traceId);
        }
    }
}

写好Utils之后,还需要在拦截器里面埋点,我没有单独写拦截器,而是在网关的Token拦截鉴权的时候,进行埋点

/**
 * 鉴权过滤器 
 **/
@Component
@Slf4j
public class TokenAuthFilter extends ZuulFilter {
    //******************省略鉴权代码*****************//
    
    /**
     * 是否需要执行该过滤器
     *
     * @return
     */
    @Override
    public boolean shouldFilter() {
        //..............省略鉴权代码

        //请求打点
        PlumeLogUtils.setTraceIdInRequest(request);


        //..............省略鉴权代码
    }
}

三. 日志记录效果

avatar

avatar

avatar

avatar

avatar

img

img

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐