转载: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类。
分享到:
相关推荐
《深入解析Log4j 2.11.0源码》 Log4j,作为Java领域最常用的日志框架之一,其2.11.0版本的发布为开发者提供了更加强大、高效和灵活的日志处理能力。源码包的获取,对于开发者深入理解其工作原理、定制化需求以及...
五、源码分析 在log4j 1.2.15源码中,我们可以深入研究这些核心组件的实现细节,例如Logger是如何根据配置文件进行初始化的,Appender是如何实现日志输出的,以及Level是如何影响日志过滤的。通过对这些关键部分的...
本教程将通过源码分析,深入讲解log4j的工作原理和使用方法。 **1. log4j的基本概念** - **Logger**: 日志记录器,是log4j的核心接口,用于生成不同级别的日志事件。 - **Level**: 日志级别,包括DEBUG、INFO、...
总的来说,通过`log4j`源码的二次开发和`DatagramSocket`的使用,我们可以构建一个高效、可扩展的日志管理系统,实现对多应用、多模块日志的集中处理和有序管理,便于故障排查和数据分析。这种方案尤其适用于分布式...
3. **在Eclipse中使用Log4j源码** - **导入源码**: 解压文件后,在Eclipse中选择“File” -> “Import” -> “Existing Projects into Workspace”,然后浏览到解压后的目录,导入项目。 - **编译与构建**: 确保...
源码分析方面,我们可以关注几个关键类:`org.apache.log4j.Logger`是日志记录的主要接口,`org.apache.log4j.Category`(Logger的实现)负责实际的日志记录,`org.apache.log4j.Appender`接口定义了日志输出的基本...
Log4j是Apache组织开发的一款广泛使用的Java日志框架,版本1.2.15是其历史的一个稳定版本。这个源码包包含了Log4j的核心组件和相关配置,便于...对于Java开发者来说,理解并能灵活运用Log4j源码是一项重要的技能。
本测试源码着重关注Log4j2的性能表现,这对于理解和优化日志系统的性能至关重要。Log4j2的设计目标是提供比其前一代Log4j更高的性能,并且具有更丰富的配置选项和更低的内存占用。 1. **Log4j2架构与性能优势** - ...
总之,Log4j-1.2.13源码的分析不仅能够加深我们对日志处理的理解,还可以学习到优秀的设计模式和架构思想,是Java开发者的宝贵学习资源。在实际工作中,结合源码可以更好地定制和优化日志记录,提升软件的可维护性和...
Log4j 详解 Log4j 是一款功能强大的日志记录工具,广泛应用于 Java 应用程序中。它可以帮助开发人员调试和分析程序,记录程序的运行情况,并提供了灵活的配置方式来控制日志的输出。 Log4j 的概念 Log4j 中有三个...
Log4j、Log4j2和Fastjson的安全性问题在过去曾引起广泛关注,例如Log4j2的CVE-2021-44228(也被称为Log4Shell漏洞),这是一个远程代码执行漏洞,影响了许多使用Log4j2的系统。这个插件可能就是为了检测和利用这些...
5. **源码分析** - `org.apache.log4j.Logger`类是所有日志记录的起点,它实现了日志记录的基本方法,如`debug()`, `info()`, `warn()`等。 - `org.apache.log4j.Category`是`Logger`的旧名称,两者在源码中是等价...
在ASP.NET中实现Log4j源码,通常涉及到以下几个关键知识点: 1. 日志级别:Log4j支持多个日志级别,如DEBUG、INFO、WARN、ERROR和FATAL。开发者可以根据不同的情况选择合适级别的日志,以便在需要时过滤不重要的...
**Log4j 1.2.8 源码解析** Log4j 是一个广泛使用的 Java 日志框架,由 Apache 软件基金会开发。它为应用程序提供了灵活的日志记录功能,允许开发者调整日志级别,定制日志格式,以及将日志输出到不同的目的地,如...
本文主要探讨Log4j2异步写日志的效率,通过源码分析和测试来展示其优势。首先,我们要理解Log4j2中的异步日志工作原理。默认情况下,Log4j2使用同步模式记录日志,即每个日志事件都会阻塞直到写入完成。然而,通过...
**log4net源码分析** `log4net`是一款广泛使用的日志记录框架,它源自Java平台上的log4j,并被移植到了.NET环境中。这款开源库提供了强大的日志记录功能,支持多种输出方式,如控制台、文件、数据库等,且具有可...
在Java开发中,日志记录是一项至关重要的任务,它帮助我们追踪程序运行状态,定位问题。Log4j2是Apache提供的一款强大且灵活的日志框架,它的...通过以上分析,我们可以看到Log4j2在实现高效日志管理方面的强大能力。
"源码"标签暗示我们将讨论Log4j的内部机制或如何查看和理解其代码,这对于学习和定制Log4j功能很有帮助。而"工具"标签则表明Log4j是一个开发者常用的工具,它的使用和配置是提高开发效率的关键。 **压缩包文件名称...
在《Log4j将System.out搞到log4j中输出四》这篇博文中,作者可能详细讨论了这些步骤,并可能分享了一些实战经验。通过学习这篇博文,读者可以更深入地了解如何在实际项目中实现这一转换,提升日志管理的效率。 总结...
在Java开发中,日志记录是一项至关重要的任务,它帮助开发者追踪程序运行状态,调试问题,以及进行性能分析。...通过阅读《log4j(二):动态配置日志输出路径》这篇博文,你可以获得更详细的操作步骤和实践指导。