logback日志异步打印
最近碰到一个问题:客户的服务器程序偶尔出现请求响应过慢的情况,通过查看日志发现RSA验证签名的代码执行超过20秒,而正常情况下只需要16毫秒。
RSA证书是服务器启动就加载好的,不存在读文件慢的问题。看了一下那几行代码,最有嫌疑的就是logback日志打印的代码了。
查看了生产日志配置,logback.xml里配置为,每月生成一个文件夹,当月的日志文件都在同一文件夹下,比如201901文件夹下是2019年1月的所有日志文件。每个文件配置为*.log.zip后缀,大小为10MB,也就是说10MB为大小分隔文件。日志打印类配置的是RollingFileAppender。
2019-1-30那一天,2019年1月文件夹下已经产生了5000多个日志文件,平均每天167个日志文件。
所以怀疑是日志文件太多,索引文件的时间太长导致代码执行变慢,也就是说,要这样怀疑的话,那就有一个前提:日志打印是同步的,调用打印日志的那行代码执行完了写入文件后,才会继续向下执行业务代码。
我问了好几个同事,都给我说日志打印是异步执行的,只有一个朋友说是同步的。我们都会以为打印日志写文件比较消耗时间,日志框架应该不会同步去写文件吧。然而事实却是如果不配置异步打印方式的话,就是以同步方式进行的日志打印的。
断点跟进代码发现是同步执行日志写入文件的,只有当配置的appender是AsyncAppender时,日志打印才是按照异步方式打印的。
下面是同步打印日志的情况:
logback.xml配置:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
......
</appender> <root level="DEBUG">
<appender-ref ref="CONSOLE"/>
</root>
执行代码:
LogWork.debug("111111111111");
System.out.println("2222222222222");
运行结果:

可以看到,执行结果是先把日志框架的日志打印执行完,再执行后面的业务代码的。所以是同步的。
下面是配置异步打印日志类的方法:
异步打印日志类AsyncAppender需要引用一个其他的日志打印类,ASYNC只需要把需要打印的日志写入定义好的缓存队列里,然后开启一个守护线程去队列里取得日志调用CONSOLE日志打印器去写入文件。这样日志打印就是异步进行的了。
logback.xml配置:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
......
</appender> <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>100</queueSize>
<neverBlock>true</neverBlock>
<appender-ref ref="CONSOLE"/>
</appender> <root level="INFO">
<appender-ref ref="ASYNC"/>
</root>
执行代码:
LogWork.debug("111111111111");
System.out.println("2222222222222");
运行结果:

运行结果说明,调用日志框架打印的代码执行后只是把要打印的日志放入缓存队列,然后就继续向下执行后面的代码,所以才先打印了后面的222222,之后才打印111111。说明是现在经过配置,日志打印异步工作的。
因文章开头的问题引出了对日志打印同步性的问题,所以研究了一番,不过最终也没有和遇到的问题联系起来,因为就算知道了日志是同步打印的,也没法解释为什么偶尔出现几分钟代码执行特别慢。证据不充分,所以没法给出结论。
logback日志异步打印的更多相关文章
- logback.xml的使用,将日志异步保存到数据库中
想要把日志异步保存到数据库中,首先需要创建一个数据库,然后创建三张固定的表: https://github.com/xiaorenwu-dashijie/logback.git <?xml ve ...
- SpringBoot使用logback输出日志并打印sql信息 --经典---
最近在学习springboot以及一些springcloud插件的使用,其中发现默认的配置并不能打印一些有用的日志,所以需要自定义一些日志输出方式以便于查看日志排查问题,目前只整理了两种使用方式,如下 ...
- SpringBoot(三) - Slf4j+logback 日志,异步请求,定时任务
1.Slf4j+logback 日志 SpringBoot框架的默认日志实现:slf4j + logback: 默认日志级别:info,对应了实际生产环境日志级别: 1.1 日志级别 # 常见的日志框 ...
- SpringBoot Logback日志配置
Logback的配置介绍: 1.Logger.appender及layout Logger作为日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型.级别. ...
- spring boot 使用logback日志系统的详细说明
springboot按照profile进行打印日志 log4j logback slf4j区别? 首先谈到日志,我们可能听过log4j logback slf4j这三个名词,那么它们之间的关系是怎么样 ...
- [日志] spring boot + logback 日志输出配置
一.输出日志到控制台 springboot有很多starter(参考starter)方便快速构建项目依赖组件,logback是springboot默认的日志组件,启动即可看到打印在控制台输出的info ...
- springboo 添加logback日志
springboot默认引入logback相关的jar包 1.在 Application.properties里添加 logging.config=classpath:logback-spring.x ...
- SpringBoot系列——Logback日志,输出到文件以及实时输出到web页面
前言 SpringBoot对所有内部日志使用通用日志记录,但保留底层日志实现.为Java Util Logging.Log4J2和Logback提供了默认配置.在不同的情况下,日志记录器都预先配置为使 ...
- 【使用篇二】SpringBoot的日志体系及如何开启logback日志(15)
抄自:https://blog.csdn.net/liujun03/article/details/82684209 Java应用中,日志一般分为以下5个级别(从高到低): ERROR 错误信息 WA ...
随机推荐
- DDD领域建模基本流程
整理一个精简的DDD领域建模基本流程,供大家在DDD领域建模实践中进行参考. 搜集用户故事(用户的原始需求) 整理用户故事,抽出用例(用例表达了用户对系统的需求,定义了系统的边界以及系统外部角色和系统 ...
- ie9浏览器中h标签的嵌套问题
ie9中 h1-h6 标签中不能够嵌套h1-h6标签,否则往下看吧. 举个栗子: 我们要实现h1下的两个div实现左右分离,很简单吧? 看看html结构及css吧 <!DOCTYPE html& ...
- codeforces 696A A. Lorenzo Von Matterhorn(水题)
题目链接: A. Lorenzo Von Matterhorn time limit per test 1 second memory limit per test 256 megabytes inp ...
- Servlet初始配置 监听器和过滤器
ServletContext:application范围内的参数 此所设定的参 来源: http://note.sdo.com/my 数,在JSP网页中可以使用下列方法来取得: ${initParam ...
- 「NOIP2010」「LuoguP1514」引水入城
Description 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 N×M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一 ...
- 安装ubuntu gnome 16.04后的一些操作
好吧...其实安装了挺久了,记录一下以防忘记... 1.软件 chrome浏览器 唔..自己去官网下吧.. gnome tweak tool 不用多说,必备 sudo apt-get install ...
- this关键字使用
原文地址:https://www.cnblogs.com/alsf/p/5515996.html 一,表示类中属性 1,没有使用this的情况 class Person{ // 定义Person类 p ...
- 879C
贪心 题目看错了...还以为是从操作序列中选5个...然后半个小时没了... 我们把每位分别用0和1带入,看看返回值是什么,然后分类讨论.千万不用特判!!!之前忘了删了就fst... #include ...
- docker容器管理基础
1.命令: docker info #查看服务器上docker详细信息 docker search #搜索镜像 docker image pull nginx:1.14-alpine #下载一个镜像 ...
- 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时3
课时3 计算机视觉历史回顾与介绍下 ImageNet有5000万张图片,全部都是人工清洗过得,标注了超过2万个分类. CS231n将聚焦于视觉识别问题,图像分类关注的是大图整体:物体检测告诉你东西具体 ...