logback高级特性使用(三)

2023-05-16

本文转自:点击打开链接



异步记录日志


注意:该功能需要高版本才能支持,如1.0.11。

AsyncAppender,异步记录日志。

工作原理:
当Logging Event进入AsyncAppender后,AsyncAppender会调用appender方法,append方法中在将event填入Buffer(这里选用的数据结构为BlockingQueue)中前,会先判断当前buffer的容量以及丢弃日志特性是否开启,当消费能力不如生产能力时,AsyncAppender会超出Buffer容量的Logging Event的级别,进行丢弃,作为消费速度一旦跟不上生产速度,中转buffer的溢出处理的一种方案。AsyncAppender有个线程类Worker,它是一个简单的线程类,是AsyncAppender的后台线程,所要做的工作是:从buffer中取出event交给对应的appender进行后面的日志推送。

从上面的描述中可以看出,AsyncAppender并不处理日志,只是将日志缓冲到一个BlockingQueue里面去,并在内部创建一个工作线程从队列头部获取日志,之后将获取的日志循环记录到附加的其他appender上去,从而达到不阻塞主线程的效果。因此AsynAppender仅仅充当事件转发器,必须引用另一个appender来做事。

在使用AsyncAppender的时候,有些选项还是要注意的。由于使用了BlockingQueue来缓存日志,因此就会出现队列满的情况。正如上面原理中所说的,在这种情况下,AsyncAppender会做出一些处理:默认情况下,如果队列80%已满,AsyncAppender将丢弃TRACE、DEBUG和INFO级别的event,从这点就可以看出,该策略有一个惊人的对event丢失的代价性能的影响。另外其他的一些选项信息,也会对性能产生影响,下面列出常用的几个属性配置信息:

属性名类型描述
queueSizeintBlockingQueue的最大容量,默认情况下,大小为256。
discardingThresholdint默认情况下,当BlockingQueue还有20%容量,他将丢弃TRACE、DEBUG和INFO级别的event,只保留WARN和ERROR级别的event。为了保持所有的events,设置该值为0。
includeCallerDataboolean提取调用者数据的代价是相当昂贵的。为了提升性能,默认情况下,当event被加入到queue时,event关联的调用者数据不会被提取。默认情况下,只有"cheap"的数据,如线程名。


默认情况下,event queue配置最大容量为256个events。如果队列被填满,应用程序线程被阻止记录新的events,直到工作线程有机会来转发一个或多个events。因此队列深度需要根据业务场景进行相应的测试,做出相应的更改,以达到较好的性能。

下面给出一个使用的配置示例:

[html]  view plain copy
  1. <appender name="FILE" class"ch.qos.logback.core.rolling.RollingFileAppender">  
  2.             <!-- 按天来回滚,如果需要按小时来回滚,则设置为{yyyy-MM-dd_HH} -->  
  3.             <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
  4.                  <fileNamePattern>/opt/log/test.%d{yyyy-MM-dd}.log</fileNamePattern>  
  5.                  <!-- 如果按天来回滚,则最大保存时间为1天,1天之前的都将被清理掉 -->  
  6.                  <maxHistory>30</maxHistory>  
  7.             <!-- 日志输出格式 -->  
  8.             <layout class="ch.qos.logback.classic.PatternLayout">  
  9.                  <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</Pattern>  
  10.             </layout>  
  11. </appender>  
  12.      <!-- 异步输出 -->  
  13.      <appender name ="ASYNC" class"ch.qos.logback.classic.AsyncAppender">  
  14.             <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->  
  15.             <discardingThreshold >0</discardingThreshold>  
  16.             <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->  
  17.             <queueSize>512</queueSize>  
  18.             <!-- 添加附加的appender,最多只能添加一个 -->  
  19.          <appender-ref ref ="FILE"/>  
  20.      </appender>  
  21.        
  22.      <root level ="trace">  
  23.             <appender-ref ref ="ASYNC"/>  
  24.      </root>  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

logback高级特性使用(三) 的相关文章

随机推荐

  • Unable to instantiate activity ComponentInfo

    出现以下错误 xff1a 这是不能实例类 java lang RuntimeException Unable to instantiate activity ComponentInfo cn edu bztc happyIdiom cn e
  • zynq学习之程序固化SD卡和QSPI_FLASH

    在进行zynq程序固话时需要注意的几点 xff1a 1 在硬件中添加QSPI FLASH模块 2 修改QSPI的时钟到125M 3 制作所要烧写的BOOT bin文件 xff0c 需要FSBL elf bit elf三个文件 4 创建新的工
  • 使用 GDebi 默认代替 Ubuntu 软件中心

    GDebi xff0c 一个安装 Debian 可执行文件的专用程序 它极其轻量 xff0c 且专注于安装 deb 文件 xff0c 可以自动解决依赖问题 xff0c 比原生的好用 GDebi 最有用的功能是它也可以为你展示出将要安装的程序
  • PowerShell配置Conda (强迫症取消base)

    首先 xff0c 下载安装anaconda xff0c 正常流程 然后 xff0c 将conda的路径添加到系统环境path或者用户path中 以上都是常规操作 然后打开powershell xff0c 输入conda init power
  • <操作系统>生产者消费者问题—共享有限缓冲区(C语言实现)

    问题描述 xff1a 思路 xff1a 代码 xff1a span class token macro property span class token directive keyword include span span class
  • 物联网开发笔记(79)- 使用Micropython开发ESP32开发板之UART串口编解码(Thonny+串口调试助手+Python IDE)

    一 目的 这一节我们学习如何使用我们的ESP32开发板来进行串口通信 xff0c 使用不同工具来收发数据 xff0c 查看编解码情况 二 环境 ESP32 43 串口调试助手 43 Python3 IDE 43 Thonny IDE 43
  • 一行python命令让手机读取电脑文件

    本文讲解python的一个内置文件传输下载器 xff0c 可以用来在局域网内进行文件传输 xff0c 当然可能有人会问 xff0c 我用微信QQ也能传 xff0c 为什么还要用python来传输下载 xff1f 在此 xff0c 其实我个人
  • Settings数据库的读取和监听

    我们还是先来了解一下settings db数据库中system表存放的是什么 从字面意思我们就可以看出 xff0c settings system为系统数据库 xff0c 里面存放的数据大多为系统的一些配置数据 xff0c 包括还有一些应用
  • 头文件atlstr.h使用错误问题

    我的代码编译时出现如下错误 xff1a Error 33 fatal error LNK1120 1 unresolved externals Error 32 error LNK2001 unresolved external symbo
  • ubuntu编译服务器搭建

    我们现在开始做Android项目 xff0c 编译Android源码必不可少 但是Android编译需要Linux平台 xff08 一般都采用ubuntu xff09 xff0c 而且各种环境搭建繁杂 xff0c 编译时间长 xff0c 占
  • SWDL学习篇

    WSDL 学习篇 1 什么是WSDL WSDL 是网络服务描述语言 xff0c 使用xml 编写 xff0c 是xml 文档 xff0c 可规定服务的位置以及提供服务的操作和方法 2 WSDL 文档结构 1 lt portType gt 元
  • linux面试题

    1 在Linux系统中 以 文件 方式访问设备 2 Linux内核引导时 从文件 etc fstab 中读取要加载的文件系统 3 Linux文件系统中每个文件用 i节点 来标识 4 全部磁盘块由四个部分组成 分别为 引导块 专用块 i节点表
  • MySql学习笔记(一)MySql卸载和安装说明

    MySql卸载 开始 控制面板 程序和功能 MySQL server xx 卸载 删除 C Program Files x86 MySQL 文件 删除 C ProgramData MySQL 文件 xff08 隐藏目录 xff09 如果以上
  • MySql学习笔记(二)MySql配置文件和服务操作说明

    Mysql配置文件说明 MySQL MySQL ServerX X my ini mysqld 为服务端配置 xff0c 服务端端口号 port 61 3306 安装目录 basedir 61 34 C Program Files MySQ
  • MySql学习笔记(三)MySql常用命令说明

    一 数据库命令 1 1显示数据库命令 命令 xff1a mysql gt show databases 执行后 xff1a 43 43 Database 43 43 information schema mysql performance
  • ubuntu 使用dpkg手动安装deb包时发生循环依赖的解决办法

    将循环依赖的所有包放到同一个命令行里一起安装 xff0c 如 xff1a sudo dpkg i libnss3 nssdb 3 28 4 0ubuntu0 14 04 4 all deb libnss3 3 28 4 0ubuntu0 1
  • 什么是源端口和目的端口

    源端口就是指本地端口 目的端口就是远程端口 一个数据包 xff08 pocket xff09 被解封装成数据段 xff08 segment xff09 后就会涉及到 连接上层协议的端口问题 很多人都在源端口和目的端口这两个概念上犯迷糊 xf
  • ini文件

    关于ini 文件的存储于加载 xff0c 初次遇到 xff0c 刚接触ini 文件 xff0c 我想我该把它记下 xff0c 以后提醒自己要常用 参数 保存 xff1a 参数结构体 struct TextConfig int nVol 音量
  • MIUI9线刷包精简

    MIUI9线刷包精简 1 说明 xff1a 系统包一经修改 xff0c 将无法通过OTA升级 xff08 可能只是修改system分区的无法OTA升级 xff0c 一般精简都修改system分区 xff0c system分区未修改的能不能O
  • logback高级特性使用(三)

    本文转自 xff1a 点击打开链接 异步记录日志 注意 xff1a 该功能需要高版本才能支持 xff0c 如1 0 11 AsyncAppender xff0c 异步记录日志 工作原理 xff1a 当Logging Event进入Async