logback中常用的appender有ch.qos.logback.core.ConsoleAppender和ch.qos.logback.core.rolling.RollingFileAppender两种,前者作为控制台输出在生产环境中可关闭。后者滚动文件输出,作为磁盘IO来说,在高并发场景下必然容易作为瓶颈,所幸,logback提供了AsyncAppender异步输出方式来提高性能。

实现异步有很多方式,Logback用的是队列+多线程,类似用队列实现了生产者消费者模式。使用方法是只需要在logback.xml配置一下就好:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, -->
<!-- appender是configuration的子节点,是负责写日志的组件。 -->
<!-- ConsoleAppender:把日志输出到控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n</pattern> <charset>UTF-8</charset>
</encoder>
</appender> <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
<appender name="syslog"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- <File>logs/log.log</File> -->
<!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 -->
<!-- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
<!-- 文件名:log/sys.2017-12-05.0.log -->
<fileNamePattern>logs/log-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>60MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<!-- pattern节点,用来设置日志的输入格式 -->
<pattern>
[ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n
</pattern>
<!-- 记录日志的编码 -->
<charset>UTF-8</charset>
</encoder>
</appender>

<appender name="ASYNC_ROLLING_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <queueSize>256</queueSize> <!-- 队列长度,默认256-->

      <includeCallerData>true</includeCallerData>

<appender-ref ref="syslog"/>
     </appender>

    <!-- 控制台输出日志级别 -->
<root level="INFO">
<!-- <appender-ref ref="STDOUT"/> -->
<appender-ref ref="ASYNC_ROLLING_FILE"/>
</root>
</configuration>

需要注意的是,为了保证性能,AsyncAppender会在队列长度达到80%的时候丢弃error以外的正常日志,而随意加大队列长度进行缓冲又会影响性能和加大日志的延迟,所以这个又是一个需要根据实际情况而具体问题具体分析的指标。

属性名

类型

默认值

描述

queueSize

int

256

内置BlockingQueue的最大容量

discardingThreshold

int

-1

默认情况下,当blockingQueue的容量高于阈值时(80%),会丢弃ERROR以下级别的日志,如果不希望丢弃日志(既每次都是全量保存),那可以设置为0,但是如果队列满的时候,会丢弃所有插入队列的日志信息,所以建议设置为-1(默认值)。 如正常日志可以丢弃,那可以极大的提升性能,并保存关键的ERROR日志。

includeCallerData

boolean

false

提取调用者数据的代价是相当昂贵的。为了提升性能,默认情况下,当event被加入到queue时,event关联的调用者数据不会被提取。默认情况下,只有"cheap"的数据,如线程名。比如日志中的代码行号如果需要输出则应将该值设为true。实测includeCallerData=true会带来一定性能下降,但高并发下仍远比同步日志方式的tps要高。

经实测,在我的window系统笔记本,1000并发压测同样的springboot框架,AsyncAppender可带来300tps到2000tps的提升。 而在linux服务器下测试结果对比更加明显,2000并发下的600tps一跃至14000tps !

<includeCallerData>true</includeCallerData>

log4j学习(二) 高并发logback的更多相关文章

  1. linux学习之高并发服务器篇(二)

    高并发服务器 1.线程池并发服务器 两种模型: 预先创建阻塞于accept多线程,使用互斥锁上锁保护accept(减少了每次创建线程的开销) 预先创建多线程,由主线程调用accept 线程池 3.多路 ...

  2. SSM框架学习之高并发秒杀业务--笔记5-- 并发优化

    前几节终于实现了这个高并发秒杀业务,现在问题是如何优化这个业务使其能扛住一定程度的并发量. 一. 优化分析 对于整个业务来说,首先是分析哪些地方会出现高并发,以及哪些地方会影响到了业务的性能.可能会出 ...

  3. SSM框架学习之高并发秒杀业务--笔记1-- 项目的创建和依赖

    在慕课网上看了Java高并发秒杀API视屏后,觉得这个案例真的让我学到了很多,现在重新自己实现一遍,博客记下,顺便分析其中的要点. 第一步是项目的创建和依赖 利用Maven去创建工程然后导入Idea中 ...

  4. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  5. django celery的分布式异步之路(二) 高并发

    当你跑通了前面一个demo,博客地址:http://www.cnblogs.com/kangoroo/p/7299920.html,那么你的分布式异步之旅已经起步了. 性能和稳定性是web服务的核心评 ...

  6. 《java学习二》并发编程

    多线程创建方式 1.继承thread类,重写run方法 CreateThread createThread = new CreateThread();     ------createThread  ...

  7. 系统学习java高并发系列一

    转载请注明原创出处,谢谢! JAVA服务端或者后端需要大量的高并发计算,所以高并发在JAVA服务端或者后端编程中显的格外重要了. 首先需要有几个概念: 1.同步和异步 同步异步是来形容方法的一次调用的 ...

  8. 系统学习java高并发系列二

    转载请注明原创出处,谢谢! 什么是线程? 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程 ...

  9. SSM框架学习之高并发秒杀业务--笔记3-- Service层

    上一节中已经包DAO层编写完成了,所谓的DAO层就是所有和数据访问的部分都应该放在这个层里,它负责与数据库打交道.对于一个web项目来说,大概由这几部分组成: 1. 前台的显示层. 2. 分发处理请求 ...

随机推荐

  1. Java-Class-C:org.springframework.util.Assert

    ylbtech-Java-Class-C:org.springframework.util.Assert 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部 1. /* * Copyr ...

  2. jeecg 实现lhgDialog窗口传值

    需要在jeecg中的dialog弹框往调用的窗口赋值. 定义内容页调用窗体实例对象接口 var windowapi = frameElement.api ; var W = windowapi.ope ...

  3. Naive RNN vs LSTM vs GRU、attention基础

    原文地址:https://www.jianshu.com/p/b8653f8b5b2b 一.Recurrent Neural Network 二.Naive RNN Naive RNN更新参数时易出现 ...

  4. python基础讲解部分&纯小白需要扎实基础

    第一章知识点 一.Python简介 ​ python的创始人为吉多·范罗苏姆(Guido van Rossum),在中国人称龟叔 ​ Python崇尚优美.清晰.简单 应用领域: ​ (1)云计算,写 ...

  5. 47-Ubuntu-系统信息-2-df和du查看磁盘和目录空间占用

    序号 命令 作用 01 df -h disk free 显示磁盘剩余空间;-h以人性化的方式显示文件大小 02 du -h [目录名] disk usage 显示目录下的文件大小 注:显示磁盘信息的时 ...

  6. 浅析vue响应式原理

    图很清晰 当我们把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 g ...

  7. webpack4 入门配置研究

    1. 全局安装 npm install webpack webpack-cli webpack-dev-server -g 1.1)输密文的密码(电脑开机) 1.2)安装成功 2. 输入命令mkdir ...

  8. element ui 弹出组件的遮罩层在弹出层的上面的解决方法

    <el-dialog title="收货地址" :visible.sync="dialogFormVisible" :modal-append-to-bo ...

  9. sqlserver 如何瞬间执行上万条数据

    核心的内容是:使用自定义表类型 第一步:创建存储过程P_T1DeclareInfo_Upload_new 参数: T1DeclareInfo_UploadPNSN_Param  类型 T1Declar ...

  10. API详解