easy-ms-logging是一个基于spring的、异步输出日志的功能增强型框架,是Easy-Ms的一个组件框架,但也支持在非Easy-Ms项目的Spring Boot或Spring Mvc项目中使用。
六、 easy-ms-logging与logback异步性能比较
好处: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>
<!-- 如果是直接引入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-logging框架的,可以按照下面两种方法引入后使用。
直接在项目pom.xml中按照依赖引入即可,支持spring boot 1.x.x和spring boot 2.x.x。
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
/**
* 用于异步日志的测试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异步日志框架的截图:
logback可分为以下几种模式:同步、异步(阻塞型)、异步(阻塞型-丢失模式)、异步(非阻塞型)。
测试代码:
使用同步模式打印控制台、日志滚动文件两种:
测试结果:
测试代码:
使用异步模式打印控制台、日志滚动文件两种:
阻塞型
阻塞型-允许丢弃
非阻塞性
同步模式
打印效率比较低,且打印的appender越多所需时间越多。异步阻塞模式
比同步模式
打印效率要高一些,而且随着queueSize的值增大而有所性能提升,但是提升有限**,这个取决于logback的异步实现原理(点击此处查看logback异步源码分析),原因是因为阻塞模式下日志添加到队列时,若队列已满会阻塞线程,每当队列中一条日志打印完成后才会把新日志添加进队列,即队列满时logback的异步几乎等价于同步模式。异步阻塞-允许丢失模式
及异步非阻塞模式
**两种模式都是一百万条日志却只打印了不到六万条,日志丢失率非常高,不推荐。我们提供框架的维护和技术支持,提供给感兴趣的开发人员学习和交流的平台,同时希望感兴趣的同学一起加入我们让框架更完善,让我们一起为了给大家提供更好更优秀的框架而努力。
若该框架及本文档中有什么错误及问题的,可采用创建Issue、加群@管理、私聊作者或管理员的方式进行联系,谢谢!
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。