Log4j2异步情况下怎么防止丢日志的源码分析以及队列等待和拒绝策略分析
org.apache.logging.log4j.core.async.AsyncLoggerConfigDisruptor
以下所有源码均在此类中
首先我们看下log4j2异步队列的初始化

从这里面我们可以看到,使用的是单例的线程池,这里请注意,这个线程池里定义的是后台线程

并且对于线程池的实现我们不可以自定义配置,是写死的,为什么要这样做呢?原因是为了保证日志的顺序性.

而在stop()方法也就是服务关闭的处理逻辑里,将循环条件设置为(队列不为空&&次数<200次),每次则将线程休眠50毫秒,为什么要这样做呢?这是为了拖延jvm的关闭,因为我们的线程池使用的是后台线程,所以刷日志线程也不会延长jvm的生命周期,因此需要一个前台线程保证jvm不会马上关闭
说完这个,再说说Discuptor那边的消费者阻塞策略,因为消费者并不是直接操作RingBuffer的,而是通过ConsumerBarrier对象间接地操作RingBuffer。像生产者一样,Consumer要知道它的下一个读取需要才能读取。Consumer并不是一个个地读取数据,而是批量读取,举个栗子:如果它处理完了6号slot以前的数据,那么接下来它期待处理7号slot。ConsumerBarrier返回RingBuffer的最大可访问序号,假如是10。如果7号以后的slot还没有数据,那么它会根据ConsumerBarrier里面的WaitStrategy策略进行等待,直到生产者生产完数据。同时,生产者每次生产完一个数据之后都会通知Consumer,而不是Consumer每次都去询问。直到生产完10号slot的数据之后,Consumer才会一次性读取几个slot的数据,然后才更新自己的cursor。
它们分别是
Block:阻塞等待
Timeout: 使用LockSupport的parkNanos()方法来睡眠,好处是在睡眠的时候不会浪费CPU,坏处是因为是定时睡眠,所以会导致延迟较大
Yield: 空转调用Thread.yield(),让出CPU资源给其它线程,但是自己依然会去抢时间片,这个是最及时的
Sleep: 是一种混合方式,先开始spin(CPU空转),之后没有就绪就 Thread.yield(),在之后就会block,这个算是最佳方案吧
关于这个如何设置

根据源码分析到要在classpath下建立一个这个名字的文件,然后写上这样的属性

如下图:

我们再说说队列满的情况下的拒绝策略吧

就是这三种,第一种的意思是,继续异步线程调用排队,第二种的意思是,阻塞当前线程等待,第三种就是丢弃
我们可以这样子指定

或者按照官网说的这样做就行

Log4j2异步情况下怎么防止丢日志的源码分析以及队列等待和拒绝策略分析的更多相关文章
- gorm的日志模块源码解析
gorm的日志模块源码解析 如何让gorm的日志按照我的格式进行输出 这个问题是<如何为gorm日志加traceId>之后,一个群里的朋友问我的.如何让gorm的sql日志不打印到控制台, ...
- iOS下使用SHA1WithRSA算法加签源码
首先了解一下几个相关概念,以方便后面遇到的问题的解决: RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的,RSA就是取自他们三个人的名字.算法基于一个数 ...
- 业务类接口在TCP,HTTP,BLL模式下的实例 设计模式混搭 附源码一份
业务类接口在TCP,HTTP,BLL模式下的实例 设计模式混搭 附源码一份 WinForm酒店管理软件--框架这篇随笔可以说是我写的最被大家争议的随笔,一度是支持和反对是一样的多.大家对我做的这个行业 ...
- 【转载】MacOS下IntelliJ IDEA关联JDK1.8源码
原文地址: MacOS下IntelliJ IDEA关联JDK1.8源码 1 打开jdk设置,找到具体添加的地方 2 找到自己jdk的源码位置替换掉 3 如果没有源码或者源码没有下载解压,自己下载解压, ...
- HttpContext.Current:异步模式下的疑似陷阱之源
最近园子里首页有好几篇文章都是讲异步编程的,尤其是几篇讲博客园自身的异步化建设的文章,看了以后很有收获. 闲暇之余再重新查查资料温故知新学习一遍,重新认识了SynchronizationContext ...
- 美团、点评、猫眼App下拉加载效果的源码分享
今天我准备拿大众点评.美团.猫眼电影三款App的实例来分享一下APICloud下拉加载这个模块的效果. 美团App下拉加载效果 以美团中的下拉酷似动画的萌萌着小人儿效果作为参考,来实现的一个加载模 ...
- php 日志模块源码解析
php日志模块设计 Monolog 是PHP的一个日志类库解析 整体介绍:monolog日志模块遵循 PSR3 的接口规范.主要有日志格式类接口(格式化日志信息),处理类接口(写日志的驱动,通过扩展写 ...
- Linux下MySQL、Apache、PHP源码安装全程实录(CentOS 6.4)
转自http://www.zjmainstay.cn/lamp-config 本文记录了我自己配置LAMP的全过程,借此记录一下,同时希望能够帮助一下需要帮助的LINUX新人,跟我一起学习,一起进步. ...
- Unity上一页下一页切换功能实现源码(仅供参考)
在做项目时我们有时需要实现切换上一页下一页图片,切换上一首下一首歌曲等等类似的功能.这里写了个简单的实现源码(仅供参考),要是有更好的方法欢迎提出来,共同进步~ 以切换上一页下一页图片为例: usin ...
随机推荐
- WebStorm 配置less
1.打开Webstorm的Setting 搜索,watch 找到 File watch,点击右侧加号添加Less. 2.配置, working directory. Output paths
- 作用域插槽 向父组件传递 <template slot-scope="{ row, index }" slot="dateNo">
作用域插槽 向父组件传递 <template slot-scope="{ row, index }" slot="dateNo"> slotTes ...
- selenium--Xpath定位
前戏 前面介绍过了七种定位方式,今天来介绍最后一种,也是最强大,本人最常用的定位方式xpath Xpath 即为 xml 路径语言,它是一种用来确定 xml 文档中某部分位置的语言.Xpath 基于 ...
- fclose - 关闭流
SYNOPSIS 总览 #include <stdio.h> int fclose(FILE *stream); DESCRIPTION 描述 函数 fclose 将名为 stream 的 ...
- Windows10+anaconda,python3.5, 安装glove-python
Windows10+anaconda,python3.5, 安装glove-python安装glove安装之前 Visual C++ 2015 Build Tools开始安装安装glove最近因为一个 ...
- 2018年,最经典的26个JavaScript面试题和答案!
根据 Stack Overflow 的 2018 年度调查,JavaScript 连续六年成为最常用的编程语言.所以我们必须面对这样的现实,JavaScript 已经成为全栈开发技能的基石,在全栈开发 ...
- 面试Python工程师,这几道编码题有必要背背,Python面试题No8
第1题:列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25]. map是python高阶用法,字面意义是映射,它的 ...
- Python Hashlib笔记
#python3.4hashlib module - A common interface to many hash functions.hash.digest() - Return the dige ...
- 2. vsCode 安装GoCode
1)安装gocode 打开命令提示符(以管理员身份打开),输入: go get -u -v github.com/nsf/gocode 开始下载: 下载完毕: 下载完成,查看D:\GoWorks目录, ...
- js实现一个简单的响应式双向数据绑定
一,基本原理 我们这里使用了对象中的一个特殊属性:访问器属性,这个属性不能在对象中设置,而是必须通过defineProperty()方法单独定义. 我们首先定义一个函数: var obj = { }; ...