转载:http://jmut.bokee.com/
接着来。
昨天说过,Category实现了AppenderAttachable接口,可以视为是Appender的容器,但是它又有私有域aai,且aai才是真正的Appender容器在,所以Category的容器方法是对aai上方法的包装,Category把对Appender的管理委托给了aai。
来看Category的addAppender方法:
/**
Add newAppender to the list of appenders of this
Category instance.
If newAppender is already in the list of
appenders, then it won't be added again.
*/
synchronized
public
void addAppender(Appender newAppender) {
if(aai == null) {
aai = new AppenderAttachableImpl();
}
aai.addAppender(newAppender);
repository.fireAddAppenderEvent(this, newAppender);
}
明显,Category确实是委托了对Appender的管理给aai,但是
repository.fireAddAppenderEvent(this, newAppender);
在做什么呢?repository是什么?仓库,听起来像是个工厂,看看它的代码。repository是LoggerRepository接口类型,而LoggerRepository接口的注释说:
/**
A LoggerRepository is used to create and retrieve
Loggers. The relation between loggers in a repository
depends on the repository but typically loggers are arranged in a
named hierarchy.
In addition to the creational methods, a
LoggerRepository can be queried for existing loggers,
can act as a point of registry for events related to loggers.
@author Ceki Gülcü
@since 1.2 */
再由接口中的方法,可以看出这个接口也可以看作是一种容器,在这里面的Appender是有标识的,由方法:
public
abstract
void fireAddAppenderEvent(Category logger, Appender appender);
的签名可以看出这个标识是Category。
到这里,可以说在Category中至少有两个容器在管理Appender存储,aai上没有组织,repository里的Appender是有组织的。
猜想,aai是局部的容器,repository是全局的容器。
接下来分析Category的方法callAppenders:
/**
Call the appenders in the hierrachy starting at
this. If no appenders could be found, emit a
warning.
This method calls all the appenders inherited from the
hierarchy circumventing any evaluation of whether to log or not
to log the particular log request.
@param event the event to log. */
public
void callAppenders(LoggingEvent event) {
int writes = 0;
for(Category c = this; c != null; c=c.parent) {
// Protected against simultaneous call to addAppender, removeAppender,...
synchronized(c) {
if(c.aai != null) {
writes += c.aai.appendLoopOnAppenders(event);
}
if(!c.additive) {
break;
}
}
}
if(writes == 0) {
repository.emitNoAppenderWarning(this);
}
}
这里面有几点要说。
第一,由c.aai.appendLoopOnAppenders(event)看出aai的确是做为局部容器在用,它只管理当前Category的Appender。
第二,additive决定是否要回溯,它控制是否要使用父类的Appender。
第三,对Category进行同步访问,因为Category是可以在多线程环境中使用的。
Category的方法:
/**
Starting from this category, search the category hierarchy for a
non-null level and return it. Otherwise, return the level of the
root category.
The Category class is designed so that this method executes as
quickly as possible.
*/
public
Level getEffectiveLevel() {
for(Category c = this; c != null; c=c.parent) {
if(c.level != null)
return c.level;
}
return null; // If reached will cause an NullPointerException.
}
从当前Category开始,向上寻找第一个有效的Level。
Category的使用入口是getInstance:
/**
* @deprecated Make sure to use {@link Logger#getLogger(String)} instead.
*/
public
static
Category getInstance(String name) {
return LogManager.getLogger(name);
}
/**
* @deprecated Please make sure to use {@link Logger#getLogger(Class)}
* instead.
*/
public
static
Category getInstance(Class clazz) {
return LogManager.getLogger(clazz);
}
它们把工作交给了LogManger类。
分享到:
相关推荐
Log4j2效率测试源码
log4j返序列化源码分析
log4j 介绍 log4j 1.x 源码分析 logback log4j2介绍
分三类文件,pom通过maven构建所需jar包,log4j2.xml配置文件,TestController.java测试类,使用debug测试效果较明显。
深入的介绍log4j的各种使用方法,不容错过
apache-log4j-2.4-src.zip 源码加入,就可以看到log4j内部的源码了
NULL 博文链接:https://adrain-work-163-com.iteye.com/blog/1545091
log4c的源代码。log4c是用C语言编写的日志工具,借鉴了log4j的思想,可以自由配置日志的输出格式、输出文件等,是一个很方便的程序调试、运行追踪工具。还有一个C语言的日志工具是ZLog,与这个有些像。
优秀而且实用的代码有很多,比如Junit,比如Jive,比如petStore,甚至是tomcat的Example、Log4j的Example。 一段广告完毕,下面就为大家分析一下struts-menu的源码,作为送给大家的圣诞礼物吧。Struts-Menu也来自一...
slf4j使用 SLF4J 是为各种 loging APIs 提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的...也可以通过 SLF4J 提供的 API 实现来开发相应的适配器如 Log4jLoggerAdapter、JDK14LoggerAdapter。
Log4j、slf4j(by Plinio Freire) 和 ActiveMQ 收集将使其与其他程序轻松兼容。 介绍幻灯片 有什么区别。 RrRabbit 旨在可视化错误日志 易于集成到现有的 Java 应用程序上。 한국어 설명은 에 있습니다。 结构 Web ...
--演示了如何在Spring Boot里面使用日志配置,以及logback,log4j2等日志的使用 23 Spring Boot 监控和度量47:09 --Spring Boot内置的监控点、自定义的监控状况检查、自定义度量统计,输出等等 24 Spring Boot ...
spring mvc maven项目,导入IDEA后无报错,需要在IDEA中...该项目使用servlet3.0规范,无web.xml,无spring.xml等配置文件,所有的配置均通过Java Config、注解搞定,项目中还集成了log4j2技术,以及前端html文件等。
java8 集合源码分析 spider-tangpoem项目 优雅的使用WebMagic框架,爬取唐诗别苑网的诗人诗歌数据 ...日志log4j 1.7.25 Java反射 单例模式、工厂模式、代理模式 项目结构 biz包:包括页面爬取逻辑的
支持的体制格式有:Syslog、 Log4j、Java GC log。具有以下功能:Remote access to logs via a single CLIMulti-host summaries of log line frequenciesMulti-host realtime tailing (like tail -f) 标签:...
6.2 建立Log4j的开发环境 6.2.1 下载Log4j 6.2.2 配置Log4j 6.3 Log4j的使用方法 6.3.1 配置Log4j 6.3.2 配置根Logger 6.3.3 指定日志输出位置 6.3.4 指定日志输出格式 6.3.5 指定日志输出优先级 6.3.6 在代码中使用...
4.日程/任务管理(包括日志之类的Log4J、JUnit技术) 5.项目管理 6.数据字典 .......................................................................... 六、课程特色 1真实性、实战性 如果您能够完整的学好这个...
日志管理:Log4j 2.10.0 JS框架:Jquery 1.8.0 UI框架: EasyUI 1.3.5 模板框架: AdminLTE 2.4.0 项目管理框架: Maven 3.2.3 开发环境: IDE: IntelliJ IDEA 2017+ eclipse DB: Mysql5.7.4 JDK: JDK1.8 Maven: Maven...
包含爬虫,Scala代码,Spark,Hadoop,ElasticSearch,logstash,Flume,echarts,log4j emotional_analysis_spider 爬虫模块 emotional_analysis_web 数据处理模块(Scala代码) emotional_analysis_recommend 推荐模块...