# Plumelog
**Repository Path**: finalcode/easy_log
## Basic Information
- **Project Name**: Plumelog
- **Description**: 一个java分布式日志组件,支持百亿级别,日志从搜集到查询,不用去文件中翻阅日志方便快捷,支持查询一个调用链的日志,支持链路追踪,查看调用链耗时情况,在分布式系统中也可以查询关联日志,能够帮助快速定位问题,简单易用,没有代码入侵,查询界面友好,高效,方便,只要你是java系统,不要做任何项目改造,接入直接使用,日志不落本地磁盘,无需关心日志占用应用服务器磁盘问题,觉得项目好用帮忙点个星星,您的star是我们前进的动力
目前进度:2.0版本完成
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: https://www.oschina.net/p/easy_log
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1360
- **Created**: 2020-06-01
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README

# Plumelog(EasyLog) 一个简单易用的java分布式日志组件
### 一.系统介绍
1. 无入侵的分布式日志系统,基于log4j、log4j2、logback搜集日志,设置链路ID,方便查询关联日志
2. 基于elasticsearch作为查询引擎
3. 高吞吐,查询效率高
4. 全程不占应用程序本地磁盘空间,免维护
5. 无需修改老项目,引入直接使用
### 二.架构
* easy_log_core 核心组件包含日志搜集端,负责搜集日志并推送到kafka,redis等队列
* easy_log_server 负责把队列中的日志日志异步写入到elasticsearch
* easy_log_ui 前端展示,日志查询界面
* easy_log_demo 基于springboot的使用案例
### 三.系统流程
1. easy_log_core 搜集日志发送到=>kafka或者redis
2. easy_log_server kafka或者redis=>elasticsearch
### 四.使用方法
### 前提:kafka或者redis 和 elasticsearch(版本6.8以上最好) 自行安装完毕,版本兼容已经做了,理论不用考虑ES版本
1. 打包
* maven deploy -DskipTests 上传包到自己的私服
私服地址到easy_log/pom.xml改
```xml
UTF-8
http://172.16.249.94:4000
```
2. 配置
#### 性能排名,log4j2>logback>log4j 如果您的项目没有特殊需求,建议用log4j2
(1)如果用log4j,引入
```xml
com.beeplay
easy_log_log4j
2.0.RELEASE
```
配置log4j配置文件,增加下面这个Appender
kafka做为中间件
```properties
log4j.appender.L=com.beeplay.easylog.core.appender.KafkaAppender
#appName系统的名称(自己定义就好)
log4j.appender.L.appName=easyjob
log4j.appender.L.kafkaHosts=172.16.247.143:9092,172.16.247.60:9092,172.16.247.64:9092
```
redis做为中间件
```properties
log4j.appender.L=com.beeplay.easylog.log4j.appender.RedisAppender
log4j.appender.L.appName=easyjob
log4j.appender.L.reidsHost=172.16.249.72
log4j.appender.L.redisPort=6379
```
同理如果使用logback,和log4j2配置如下
#### logback
* 引入
```xml
com.beeplay
easy_log_logback
2.0.RELEASE
```
* 配置
```xml
easylog
172.16.249.72
6379
easylog
172.16.247.143:9092,172.16.247.60:9092,172.16.247.64:9092
```
#### log4j2
* 引入
```xml
com.beeplay
easy_log_log4j2
2.0.RELEASE
```
* 配置
```xml
```
3. 示例(所有的列子都在easy_log_demo里面)
* 普通日志使用
要想产生traceID,需要再拦截器里增加,如下:
```java
@Component
public class Interceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
IdWorker worker = new IdWorker(1,1,1);
TraceId.logTraceID.set(String.valueOf(worker.nextId()));//设置TraceID值,不埋此点链路ID就没有
return true;
}
}
```
* [链路追踪使用](/easy_log_trace/README.md)
* TraceId跨线程传递
如果不使用线程池,不用特殊处理,如果使用线程池,有两种使用方式,(easy_log_demo也有)
#### 修饰线程池
```java
private static ExecutorService executorService = TtlExecutors.getTtlExecutorService(
new ThreadPoolExecutor(8, 8,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue()));
//省去每次Runnable和Callable传入线程池时的修饰,这个逻辑可以在线程池中完成
executorService.execute(() -> {
logger.info("子线程日志展示");
});
```
#### 修饰Runnable和Callable
```java
private static ThreadPoolExecutor threadPoolExecutor= ThreadPoolUtil.getPool(4, 8, 5000);
threadPoolExecutor.execute(TtlRunnable.get(() -> {
TraceId.logTraceID.get();
logger.info("tankSay =》我是子线程的日志!{}", TraceId.logTraceID.get());
}));
```
* [Dubbo的分布式系统traceId传递 ](/easy_log_dubbo/README.md)
4. 启动服务
* 步骤一打包完的 启动 easy_log_server-2.0.RELEASE.jar ,高可用的话直接启动多个服务就行
注意:打完的包target目录下,lib文件夹(依赖包目录),config文件夹(两个配置文件的目录),easy_log_server-1.0.jar 放到同一个目录下
* easy_log_server中easylog.properties详解
```properties
#日志缓冲区,kafka,redis两种模式
easylog.server.model=kafka
#kafka集群地址
easylog.server.host.kafkaHosts=172.16.247.143:9092,172.16.247.60:9092,172.16.247.64:9092
#如果是redis 这边填写redis地址
easylog.server.redis.redisHost=172.16.249.72:6379
#elasticsearch集群地址
easylog.server.host.esHosts=172.16.251.196:9200
#每次获取最大日志条数
easylog.server.maxSendSize=5000
#日志读取频次,单位毫秒
easylog.server.interval=100
```
* 查询界面
1.到easy_log_ui 配置 application.properties 中 es.esHosts 配置esapi地址 启动easy_log_ui-2.0.RELEASE.jar就行了
2.[前端打包文档](/easy_log_ui/README.md),也可以不用打包,easy_log_ui里面已经有一份打包好了的,如果自己修改代码那就要打包了
3.界面介绍

### 5.版本计划
2.0版本增加全链路追踪功能,优化日志抓取写入,可以做生产用,1.0是demo版本,只做思路上的参考
3.0计划版本
1.增加获取非java项目日志API接口
2.增加性能分析,和API超时、时间窗口错误数、等信息告警功能
### 6.联系交流
* QQ群:1072991065
### 7.测试地址
* 查询界面地址:https://easylog-demo.beeplaying.com
* 访问这个地址产生测试log数据:https://easylog-demo.beeplaying.com/demo/index?data=1234 data参数自己随便传,传什么打印什么