log4j里有个Appender:AsyncAppender,这个Appender是用于解决在某一时间里大量的日志信息进入Appender如何去处理的问题。AsyncAppender采用的方案是这样的,以下是AsyncAppender的工作原理图:

AsyncAppender采用的是生产者消费者的模型进行异步地将Logging Event送到对应的Appender中。 
(1)生产者:外部应用了Log4j的系统的实时线程,实时将Logging Event传送进AsyncAppender里 
(2)中转:Buffer和DiscardSummary 
(3)消费者:Dispatcher线程和appenders 
  
工作原理: 
1)  Logging Event进入AsyncAppender,AsyncAppender会调用append方法,在append方法中会去把logging Event填入Buffer中,当消费能力不如生产能力时,AsyncAppender会把超出Buffer容量的Logging Event放到DiscardSummary中,作为消费速度一旦跟不上生成速度,中转buffer的溢出处理的一种方案。 
2)  AsyncAppender有个线程类Dispatcher,它是一个简单的线程类,实现了Runnable接口。它是AsyncAppender的后台线程。 
Dispatcher所要做的工作是: 
①  锁定Buffer,让其他要对Buffer进行操作的线程阻塞。 
②  看Buffer的容量是否满了,如果满了就将Buffer中的Logging Event全部取出,并清空Buffer和DiscardSummary;如果没满则等待Buffer填满Logging Event,然后notify Disaptcher线程。 
③  将取出的所有Logging Event交给对应appender进行后面的日志信息推送。 
以上是AsyncAppender类的两个关键点:append方法和Dispatcher类,通过这两个关键点实现了异步推送日志信息的功能,这样如果大量的Logging Event进入AsyncAppender,就可以游刃有余地处理这些日志信息了。

转载于:https://www.cnblogs.com/SoulSpirit/p/3565404.html

Log4j中的AsyncAppender的实现原理相关推荐

  1. OpenGL中摄像机矩阵的计算原理

    OpenGL中摄像机矩阵的计算原理 熟悉OpenGL|ES的朋友,可能会经常设置摄像机的view矩阵,iOS中相对较好,已经封装了方向,只需要设置摄像机位置,目标点位置以及UP向量即可.下面先介绍下摄 ...

  2. JAVA中堆栈和内存分配原理

    JAVA中堆栈和内存分配原理 1.栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在 ...

  3. php new对象 调用函数,关于JS中new调用函数的原理介绍

    这篇文章主要介绍了关于JS中new调用函数的原理介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 JavaScript 中经常使用构造函数创建对象(通过 new 操作符调用一个函数) ...

  4. mysql 事物的持久性是指_详解MySQL中事务的持久性实现原理

    前言 说到数据库事务,大家脑子里一定很容易蹦出一堆事务的相关知识,如事务的ACID特性,隔离级别,解决的问题(脏读,不可重复读,幻读)等等,但是可能很少有人真正的清楚事务的这些特性又是怎么实现的,为什 ...

  5. mysql mvcc机制rc_Mysql中MVCC的使用及原理

    数据库默认隔离级别:RR(Repeatable Read,可重复读),MVCC主要适用于Mysql的RC,RR隔离级别 创建一张存储引擎为testmvcc的表,sql为: CREATE TABLE t ...

  6. Hive中Join的 MR 底层原理

    Hive中的Join可分为Common Join(Reduce阶段完成join)和Map Join(Map阶段完成join) 一. Hive Common Join 如果不指定MapJoin或者不符合 ...

  7. 理解SQL Server中索引的概念,原理

    理解SQL Server中索引的概念,原理 摘自:http://51even.iteye.com/blog/1490412 简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索 ...

  8. log4j中配置LOG_HOME无效

    最近需要修改老项目的配置文件,因为需要使用Jenkins多环境打包,项目日志用的是log4j,但是测试环境跟生成环境的日志路径不一致,自然就想到配置动态路径使用${LOG_HOME},于是有了以下配置 ...

  9. 动画中的关键帧动画的原理

    本文转载自博主"早上吃什么"<动画中的关键帧动画的原理>一文. 想一想如果制作动画,如果没有关键帧这种技术会是多么恐怖,如果动画帧率为25,即每秒要播放25张画面,假设 ...

最新文章

  1. CentOS 6.8 安装最新版 Git
  2. oracle入门知识实施,新手必须了解的oracle入门知识
  3. HDU4666 Hyperspace(数学推理+数据结构)
  4. js中实现页面跳转(返回前一页、后一页)
  5. 工信部:加强中欧在5G、物联网等领域合作
  6. ci/cd heroku_在GitLab上设置CI / CD以在Heroku上部署Python Flask应用程序
  7. 如何创建xsl文件 xml_EXCEL知识分享 I 连载如何快速创建XML文件
  8. 【王道计组笔记】I/O输入输出系统基本概念
  9. 【Beta】Phylab 测试报告
  10. Linux笔记17.数据完整性检测工具
  11. switchHosts下载地址
  12. python123平台登陆页_从头搭建一个flask鉴权系统之登陆
  13. 追赶法求解方程组(C语言)
  14. MatLab中多项式数据拟合(ployfit函数与polyval函数)
  15. 【自我介绍】小白程序员的成神之路
  16. win10查看网卡的vender ID和device ID
  17. iTool拷贝app到电脑上
  18. 服务器运维环境安全体系(上篇)
  19. html自动分列,文字的自动分列 flex 弹性盒子的一些使用方法
  20. UliPad常用技巧小贴士

热门文章

  1. 重启小狼毫输入法,rime输入法重启
  2. java classnotfoundexception e_关于解释class文件时出现java.lang.ClassNotFoundException的问题...
  3. 高德地图获取坐标距离_【转】根据高德地图得出的坐标算出两点之间的距离
  4. 苹果笔记本怎么找文件夹_苹果笔记本电脑回收价格是否合理怎么看
  5. python中else在循环中的使用(一分钟读懂)
  6. 中key的用途_Python中的函数定义与参数使用
  7. HNU 实验五 小女孩与楼梯
  8. hnu暑期实训 数码管儿
  9. c语言程序设计单元小测,C语言程序设计单元小测2.doc
  10. PyCharm汉化后无法打开Settings设置