22 Star 41 Fork 16

烟花易冷 / EASY-MS

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.md 9.82 KB
一键复制 编辑 原始数据 按行查看 历史

Easy-Ms-Logging

  easy-ms-logging是一个基于spring的、异步输出日志的功能增强型框架,是Easy-Ms的一个组件框架,但也支持在非Easy-Ms项目的Spring Boot或Spring Mvc项目中使用

目录

  一、功能特点

  二、依赖引入

    1. 使用parent的方式

    2. 直接引用

  三、 非Easy-Ms项目支持

    1. Spring Boot项目

    2. Spring Mvc项目

  四、 配置

  五、 easy-ms-logging开启与否性能比较

  六、 easy-ms-logging与logback异步性能比较

    1. logback同步

    2. logback异步

    3. 结论

一、 功能特点

  1. 采用双层异步机制,在大幅提升性能的同时还能保证占用较少内存;
  2. 采用自研无锁队列高并发下不仅无阻塞还能保证线程安全及队列顺序一致
  3. 日志对象复用,高并发下可大大降低内存的占用;
  4. 优化日志打印逻辑,高并发下减少IO次数,提升日志输出性能;
  5. 重写部分日志转化器(如日期转化器等),高并发下日志转化速度大大提升;
  6. 支持Logback(已兼容所有版本)、commons-logging,可支持其他框架的扩展;
  7. 支持实时动态开关切换(需使用配置中心),可在应用运行期间自由切换是否开启异步日志框架;
  8. 支持在线实时监控,可实时查看开关、异步日志框架的使用情况等信息;

二、 依赖引入

1. 使用parent的方式

  好处:easy-ms-parent里包含了许多的依赖版本管理,可以在依赖管理<dependencies>中,有较多常用的引入直接使用默认的版本而无需指定版本号

pom.xml:
    <!-- 可以直接把easy-ms-parent当做parent,或者当引入多个easy-ms组件时使用parent可以只需设置一次版本号 -->
    <parent>
        <groupId>com.stars.easyms</groupId>
        <artifactId>easy-ms-parent</artifactId>
        <version>${easy-ms.version}</version>
    </parent>
		
    <!-- 如果是直接引入easy-ms,则不需要引入easy-ms-logging,easy-ms已经默认依赖了easy-ms-logging -->
    <dependencies>
        <dependency>
            <groupId>com.stars.easyms</groupId>
            <artifactId>easy-ms-logging</artifactId>
        </dependency>
    </dependencies>

2. 直接引用

    <!-- 如果是直接引入easy-ms,则不需要引入easy-ms-datasource,easy-ms已经默认依赖了easy-ms-datasource -->
    <dependencies>
        <dependency>
            <groupId>com.stars.easyms</groupId>
            <artifactId>easy-ms-logging</artifactId>
            <version>${easy-ms.version}</version>
        </dependency>
    </dependencies>

三、 非Easy-Ms项目支持

  如果需要创建新的项目,可以直接引入easy-ms,如果是已存在的项目且无法改造成easy-ms项目的,但是想使用easy-ms-logging框架的,可以按照下面两种方法引入后使用。

1. Spring Boot项目

  直接在项目pom.xml中按照依赖引入即可,支持spring boot 1.x.x和spring boot 2.x.x。

2. Spring Mvc项目

  1). 在spring的xml配置文件中增加<easy-ms-logging:init/>,如下所示:

<!-- 1.在beans标签中添加[xmlns:easy-ms-logging="http://www.easy-ms.com/schema/logging"] -->
<!-- 2.在beans标签中的[xsi:schemaLocation]里添加[http://www.easy-ms.com/schema/logging http://www.easy-ms.com/schema/logging.xsd] -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:easy-ms-logging="http://www.easy-ms.com/schema/logging"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.easy-ms.com/schema/logging http://www.easy-ms.com/schema/logging.xsd">
    
    <!-- 初始化Easy-Ms异步日志框架 -->
    <easy-ms-logging:init/>

</beans>

  2). 在web.xml里增加easy-ms-logging的监听器,需要将该监听器放在所有监听器的最上方

<!-- 需要将该监听器放在所有监听器的最上方 -->
<listener>
    <listener-class>com.stars.easyms.logger.config.EasyMsLoggerListener</listener-class>
</listener>

<!-- spring的监听器需要放在EasyMsLoggerListener的下方 -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

四、 配置

配置 缺省值 说明
logging.asyn true 是否开启异步日志框架
logging.sift-asyn true 输出到sift文件时是否使用异步,若使用异步可能造成文件大小无法精确切割

  yaml配置文件如下:

# 如果不配置,默认都是true,即默认开启
logging:
  asyn: true
  sift-asyn: false

五、 easy-ms-logging开启与否性能比较

/**
 * 用于异步日志的测试demo,通过配置logging.asyn来控制是否开启异步日志</p>
 */
@Slf4j
@Service
public class EasyMsLoggingDemoService implements RestService<EasyMsLoggingDemoInput, BaseOutput> {

    @Override
    public BaseOutput execute(EasyMsLoggingDemoInput input) {
        long time = System.currentTimeMillis();
        for (int i = 0, count = input.getCount(); i < count; i++) {
            log.info("测试:" + i);
        }
        BaseOutput output = new BaseOutput();
        long usedTime = System.currentTimeMillis() - time;
        output.setRetMsg("是否启动easy-ms日志异步:" + EasyMsLoggerHelper.isLogAsynEnabled() + ", 打印" + input.getCount() + "条日志用时:" + usedTime + "毫秒");
        return output;
    }
}

  未开启Easy-Ms-logging异步日志框架的截图:

easy-ms-logging-disable-result

  开启Easy-Ms-logging异步日志框架的截图:

easy-ms-logging-enable-result

六、 easy-ms-logging与logback异步性能比较

  logback可分为以下几种模式:同步、异步(阻塞型)、异步(阻塞型-丢失模式)、异步(非阻塞型)。

1. logback同步

  测试代码:

easy-ms-logging-syn-demo

  使用同步模式打印控制台、日志滚动文件两种:

easy-ms-logging-syn-root-info

  测试结果:

easy-ms-logging-syn-result

2. logback异步

  测试代码:

easy-ms-logging-asyn-demo

  使用异步模式打印控制台、日志滚动文件两种:

easy-ms-logging-asyn-root-info

  阻塞型

easy-ms-logging-asyn-block

easy-ms-logging-asyn-block-result

  阻塞型-允许丢弃

easy-ms-logging-asyn-block-discard

easy-ms-logging-asyn-block-discard-result

easy-ms-logging-asyn-block-discard-result-1

  非阻塞性

easy-ms-logging-asyn-never-block

easy-ms-logging-asyn-never-block-result

easy-ms-logging-asyn-never-block-result-1

3. 结论

  1. logback的同步模式打印效率比较低,且打印的appender越多所需时间越多。
  2. logback的**异步阻塞模式同步模式打印效率要高一些,而且随着queueSize的值增大而有所性能提升,但是提升有限**,这个取决于logback的异步实现原理(点击此处查看logback异步源码分析),原因是因为阻塞模式下日志添加到队列时,若队列已满会阻塞线程,每当队列中一条日志打印完成后才会把新日志添加进队列,即队列满时logback的异步几乎等价于同步模式
  3. logback的**异步阻塞-允许丢失模式异步非阻塞模式**两种模式都是一百万条日志却只打印了不到六万条,日志丢失率非常高,不推荐
  4. easy-ms-logging框架的异步使用的是无阻塞队列,在不丢失日志及保证日志打印顺序的前提下,还能大大提升性能。

  我们提供框架的维护和技术支持,提供给感兴趣的开发人员学习和交流的平台,同时希望感兴趣的同学一起加入我们让框架更完善,让我们一起为了给大家提供更好更优秀的框架而努力。

  若该框架及本文档中有什么错误及问题的,可采用创建Issue、加群@管理、私聊作者或管理员的方式进行联系,谢谢!

Java
1
https://gitee.com/g250609148/EASY-MS.git
git@gitee.com:g250609148/EASY-MS.git
g250609148
EASY-MS
EASY-MS
develop-1.8.5

搜索帮助