近来碰到一个题目:客户的服务器顺序偶然涌现要求相应过慢的状况,经由过程检察日记发明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日记异步打印的要领引见(代码示例)的细致内容,更多请关注ki4网别的相干文章!