最近碰到一个问题:客户的服务器程序偶尔出现请求响应过慢的情况,通过查看日志发现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. 在centos7下手工安装和配置Nginx

    一.什么是Nginx Nginx("enginex")是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器,在高连接并发的情况下Nginx是Apa ...

  2. HDU1358 Period —— KMP 最小循环节

    题目链接:https://vjudge.net/problem/HDU-1358 Period Time Limit: 2000/1000 MS (Java/Others)    Memory Lim ...

  3. 完美解决pip install scrapy,安装Scrapy错误:Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

    1,在Python3.6 安装Scrapy 出现以下报错 2,错误分析 红色报的错误指向的是Twisted 1,Twisted 没安装上 2,Twisted 没安装成功 3,Twisted 版本与Py ...

  4. Couldn't connect to host, port: smtp.163.com, 25; timeout -1;

    运行出现以下报错: Couldn't connect to host, port: smtp.163.com, 25; timeout -1; 也要设置端口 spring.mail.port=25

  5. maven实战(1)-- maven仓库

    maven仓库配置 转自:http://blog.csdn.net/dongnan591172113/article/details/7685164 1.两类仓库 1.1本地仓库(local repo ...

  6. 移动端网页巧用 margin和padding 的百分比实现自适应

    一个基础却又容易混淆的css知识点 本文依赖于一个基础却又容易混淆的css知识点:当margin/padding取形式为百分比的值时,无论是left/right,还是top/bottom,都是以父元素 ...

  7. Oracle的db.properties文件

    转自:https://blog.csdn.net/lssqk/article/details/79133829

  8. list转json的一些问题

    利用JSONArray转换list 定义的model: package com.yds.model; import java.util.Date; public class DeviceHistory ...

  9. Task用法

    转: https://www.cnblogs.com/wyy1234/p/9172467.html

  10. 【205】C#实现远程桌面访问

    参考:Remote Desktop using C#.NET 参考文件:TscForm.zip 本博客主要是讲述怎样用 .NET 平台中 Microsoft Terminal Services Cli ...