最近碰到一个问题:客户的服务器程序偶尔出现请求响应过慢的情况,通过查看日志发现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日志异步打印的更多相关文章

  1. logback.xml的使用,将日志异步保存到数据库中

    想要把日志异步保存到数据库中,首先需要创建一个数据库,然后创建三张固定的表: https://github.com/xiaorenwu-dashijie/logback.git <?xml ve ...

  2. SpringBoot使用logback输出日志并打印sql信息 --经典---

    最近在学习springboot以及一些springcloud插件的使用,其中发现默认的配置并不能打印一些有用的日志,所以需要自定义一些日志输出方式以便于查看日志排查问题,目前只整理了两种使用方式,如下 ...

  3. SpringBoot(三) - Slf4j+logback 日志,异步请求,定时任务

    1.Slf4j+logback 日志 SpringBoot框架的默认日志实现:slf4j + logback: 默认日志级别:info,对应了实际生产环境日志级别: 1.1 日志级别 # 常见的日志框 ...

  4. SpringBoot Logback日志配置

    Logback的配置介绍: 1.Logger.appender及layout Logger作为日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型.级别. ...

  5. spring boot 使用logback日志系统的详细说明

    springboot按照profile进行打印日志 log4j logback slf4j区别? 首先谈到日志,我们可能听过log4j logback slf4j这三个名词,那么它们之间的关系是怎么样 ...

  6. [日志] spring boot + logback 日志输出配置

    一.输出日志到控制台 springboot有很多starter(参考starter)方便快速构建项目依赖组件,logback是springboot默认的日志组件,启动即可看到打印在控制台输出的info ...

  7. springboo 添加logback日志

    springboot默认引入logback相关的jar包 1.在 Application.properties里添加 logging.config=classpath:logback-spring.x ...

  8. SpringBoot系列——Logback日志,输出到文件以及实时输出到web页面

    前言 SpringBoot对所有内部日志使用通用日志记录,但保留底层日志实现.为Java Util Logging.Log4J2和Logback提供了默认配置.在不同的情况下,日志记录器都预先配置为使 ...

  9. 【使用篇二】SpringBoot的日志体系及如何开启logback日志(15)

    抄自:https://blog.csdn.net/liujun03/article/details/82684209 Java应用中,日志一般分为以下5个级别(从高到低): ERROR 错误信息 WA ...

随机推荐

  1. DDD领域建模基本流程

    整理一个精简的DDD领域建模基本流程,供大家在DDD领域建模实践中进行参考. 搜集用户故事(用户的原始需求) 整理用户故事,抽出用例(用例表达了用户对系统的需求,定义了系统的边界以及系统外部角色和系统 ...

  2. ie9浏览器中h标签的嵌套问题

    ie9中 h1-h6 标签中不能够嵌套h1-h6标签,否则往下看吧. 举个栗子: 我们要实现h1下的两个div实现左右分离,很简单吧? 看看html结构及css吧 <!DOCTYPE html& ...

  3. codeforces 696A A. Lorenzo Von Matterhorn(水题)

    题目链接: A. Lorenzo Von Matterhorn time limit per test 1 second memory limit per test 256 megabytes inp ...

  4. Servlet初始配置 监听器和过滤器

    ServletContext:application范围内的参数 此所设定的参 来源: http://note.sdo.com/my 数,在JSP网页中可以使用下列方法来取得: ${initParam ...

  5. 「NOIP2010」「LuoguP1514」引水入城

    Description 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 N×M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一 ...

  6. 安装ubuntu gnome 16.04后的一些操作

    好吧...其实安装了挺久了,记录一下以防忘记... 1.软件 chrome浏览器 唔..自己去官网下吧.. gnome tweak tool 不用多说,必备 sudo apt-get install  ...

  7. this关键字使用

    原文地址:https://www.cnblogs.com/alsf/p/5515996.html 一,表示类中属性 1,没有使用this的情况 class Person{ // 定义Person类 p ...

  8. 879C

    贪心 题目看错了...还以为是从操作序列中选5个...然后半个小时没了... 我们把每位分别用0和1带入,看看返回值是什么,然后分类讨论.千万不用特判!!!之前忘了删了就fst... #include ...

  9. docker容器管理基础

    1.命令: docker info #查看服务器上docker详细信息 docker search #搜索镜像 docker image pull nginx:1.14-alpine #下载一个镜像 ...

  10. 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时3

    课时3 计算机视觉历史回顾与介绍下 ImageNet有5000万张图片,全部都是人工清洗过得,标注了超过2万个分类. CS231n将聚焦于视觉识别问题,图像分类关注的是大图整体:物体检测告诉你东西具体 ...