分布式日志系统PlumeLog搭建
一.简介plumeLog是一个简单易用的java日志系统。其在日志收集方面做的很好,但在链路追踪方面只是简单集成,如果对链路追踪更感兴趣,可以参考另一个项目skywalking1.1 特点:无代码入侵的分布式日志系统,基于log4j、log4j2、logback搜集日志,设置链路ID,方便查询关联日志基于elasticsearch作为查询引擎高吞吐,查询效率高全程不占应用程序本地磁盘空间,免维护;
一.简介
plumeLog
是一个简单易用的java
日志系统。其在日志收集方面做的很好,但在链路追踪方面只是简单集成,如果对链路追踪更感兴趣,可以参考另一个项目skywalking
1.1 特点:
- 无代码入侵的分布式日志系统,基于log4j、log4j2、logback搜集日志,设置链路ID,方便查询关联日志
- 基于elasticsearch作为查询引擎
- 高吞吐,查询效率高
- 全程不占应用程序本地磁盘空间,免维护;对于项目透明,不影响项目本身运行
- 无需修改老项目,引入直接使用,支持dubbo,支持springcloud
1.2 架构
- 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-server
和plumelog-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);
//..............省略鉴权代码
}
}
三. 日志记录效果
更多推荐
所有评论(0)