`
tanghongjun1985
  • 浏览: 56456 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Log4J源码分析(三)

阅读更多
转载:http://jmut.bokee.com/

上回说到LogManager,接下来就分析它。
先看它的注释:

/**
* Use the LogManager class to retreive {@link Logger}
* instances or to operate on the current {@link
* LoggerRepository}. When the LogManager class is loaded
* into memory the default initalzation procedure is inititated. The
* default intialization procedure is described in the
* href="../../../../manual.html#defaultInit">short log4j manual.
*
* @author Ceki Gülcü */
可见这个类可能是负责全局Logger管理。这个类不大,但感觉它是很重要的一个类,所以有必要深入研究一下。既然在注释中提到了手册中有关于默认初始化过程的描述,那就先看看它是怎么说的。
The exact default initialization algorithm is defined as follows:

Setting the log4j.defaultInitOverride system property to any other value then "false" will cause log4j to skip the default initialization procedure (this procedure).
Set the resource string variable to the value of the log4j.configuration system property. The preferred way to specify the default initialization file is through the log4j.configuration system property. In case the system property log4j.configuration is not defined, then set the string variable resource to its default value "log4j.properties".
Attempt to convert the resource variable to a URL.
If the resource variable cannot be converted to a URL, for example due to a MalformedURLException, then search for the resource from the classpath by calling org.apache.log4j.helpers.Loader.getResource(resource, Logger.class) which returns a URL. Note that the string "log4j.properties" constitutes a malformed URL.
See

Loader.getResource(java.lang.String) for the list of searched locations.
If no URL could not be found, abort default initialization. Otherwise, configure log4j from the URL.
The PropertyConfigurator will be used to parse the URL to configure log4j unless the URL ends with the ".xml" extension, in which case the DOMConfigurator will be used. You can optionaly specify a custom configurator. The value of the log4j.configuratorClass system property is taken as the fully qualified class name of your custom configurator. The custom configurator you specify must implement the Configurator interface.

以上是就是整个初始化过程。其源码如下:
static {
// By default we use a DefaultRepositorySelector which always returns 'h'.
Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG));
repositorySelector = new DefaultRepositorySelector(h);

/** Search for the properties file log4j.properties in the CLASSPATH. */
String override =OptionConverter.getSystemProperty(DEFAULT_INIT_OVERRIDE_KEY,
null);

// if there is no default init override, then get the resource
// specified by the user or the default config file.
if(override == null || "false".equalsIgnoreCase(override)) {

String configurationOptionStr = OptionConverter.getSystemProperty(
DEFAULT_CONFIGURATION_KEY,
null);

String configuratorClassName = OptionConverter.getSystemProperty(
CONFIGURATOR_CLASS_KEY,
null);

URL url = null;

// if the user has not specified the log4j.configuration
// property, we search first for the file "log4j.xml" and then
// "log4j.properties"
if(configurationOptionStr == null) {
url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);
if(url == null) {
url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);
}
} else {
try {
url = new URL(configurationOptionStr);
} catch (MalformedURLException ex) {
// so, resource is not a URL:
// attempt to get the resource from the class path
url = Loader.getResource(configurationOptionStr);
}
}

// If we have a non-null url, then delegate the rest of the
// configuration to the OptionConverter.selectAndConfigure
// method.
if(url != null) {
LogLog.debug("Using URL ["+url+"] for automatic log4j configuration.");
OptionConverter.selectAndConfigure(url, configuratorClassName,
LogManager.getLoggerRepository());
} else {
LogLog.debug("Could not find resource: ["+configurationOptionStr+"].");
}
}
1、检查log4j.defaultInitOverride系统变量的值,false将跳过默认初始化过程。

2、读取log4j.configuration系统变量的值,生成配置文件url,默认值为log4j.properties或者log4j.xml。
// if the user has not specified the log4j.configuration
// property, we search first for the file "log4j.xml" and then
// "log4j.properties"
if(configurationOptionStr == null) {
 url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);
 if(url == null) {
 url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);
 }
} else {
 try {
  url = new URL(configurationOptionStr);
 } catch (MalformedURLException ex) {
 // so, resource is not a URL:
 // attempt to get the resource from the class path
 url = Loader.getResource(configurationOptionStr);
 }
}
3、如果url存在,则继续用OptionConverter初始化。
// If we have a non-null url, then delegate the rest of the
// configuration to the OptionConverter.selectAndConfigure
// method.
if(url != null) {
 LogLog.debug("Using URL ["+url+"] for automatic log4j configuration.");
 OptionConverter.selectAndConfigure(url, configuratorClassName,
 LogManager.getLoggerRepository());
} else {
 LogLog.debug("Could not find resource: ["+configurationOptionStr+"].");
}
我们又发现了三个重要角色 Hierarchy、OptionConverter和Loader。我们先说OptionConverter,显然它是一个工具类,提供一些基础服务。我们现在用到的方法是:
/**
Configure log4j given a URL.
The url must point to a file or resource which will be interpreted by
a new instance of a log4j configurator.
All configurations steps are taken on the hierarchy passed as a parameter.

@param url The location of the configuration file or resource.
@param clazz The classname, of the log4j configurator which will parse
the file or resource at url. This must be a subclass of
{@link Configurator}, or null. If this value is null then a default
configurator of {@link PropertyConfigurator} is used, unless the
filename pointed to by url ends in '.xml', in which case
{@link org.apache.log4j.xml.DOMConfigurator} is used.
@param hierarchy The {@link org.apache.log4j.Hierarchy} to act on.

@since 1.1.4 */

static
public
void selectAndConfigure(URL url, String clazz, LoggerRepository hierarchy) {
 Configurator configurator = null;
 String filename = url.getFile();

 if(clazz == null && filename != null && filename.endsWith(".xml")) {
  clazz = "org.apache.log4j.xml.DOMConfigurator";
 }

 if(clazz != null) {
  LogLog.debug("Preferred configurator class: " + clazz);
  configurator = (Configurator) instantiateByClassName(clazz,
  Configurator.class,null);
  if(configurator == null) {
   LogLog.error("Could not instantiate configurator ["+clazz+"].");
   return;
  }
 } else {
  configurator = new PropertyConfigurator();
 }

 configurator.doConfigure(url, hierarchy);
}
该方法先构造正确的Configurator,再进行配置。有两个默认的Configurator,一个是DOMConfigurator,一个是PropertyConfigurator是。在没有指定Configurator时,如果配置文件是以.xml结尾,则使用DOMConfigurator,否则使用PropertyConfigurator。
分享到:
评论

相关推荐

    log4j 源码包 日志包 2.11.0

    《深入解析Log4j 2.11.0源码》 Log4j,作为Java领域最常用的日志框架之一,其2.11.0版本的发布为开发者提供了更加强大、高效和灵活的日志处理能力。源码包的获取,对于开发者深入理解其工作原理、定制化需求以及...

    log4j 1.2.15 源码

    五、源码分析 在log4j 1.2.15源码中,我们可以深入研究这些核心组件的实现细节,例如Logger是如何根据配置文件进行初始化的,Appender是如何实现日志输出的,以及Level是如何影响日志过滤的。通过对这些关键部分的...

    log4j学习源码教程

    本教程将通过源码分析,深入讲解log4j的工作原理和使用方法。 **1. log4j的基本概念** - **Logger**: 日志记录器,是log4j的核心接口,用于生成不同级别的日志事件。 - **Level**: 日志级别,包括DEBUG、INFO、...

    log4j-1.2.17含源码

    源码分析方面,我们可以关注几个关键类:`org.apache.log4j.Logger`是日志记录的主要接口,`org.apache.log4j.Category`(Logger的实现)负责实际的日志记录,`org.apache.log4j.Appender`接口定义了日志输出的基本...

    Log4j工程官方源码

    3. **在Eclipse中使用Log4j源码** - **导入源码**: 解压文件后,在Eclipse中选择“File” -> “Import” -> “Existing Projects into Workspace”,然后浏览到解压后的目录,导入项目。 - **编译与构建**: 确保...

    Log4j_1.2.15 源码

    Log4j是Apache组织开发的一款广泛使用的Java日志框架,版本1.2.15是其历史的一个稳定版本。这个源码包包含了Log4j的核心组件和相关配置,便于...对于Java开发者来说,理解并能灵活运用Log4j源码是一项重要的技能。

    Log4j详解,详细讲解log4j的使用,和原理

    Log4j 中有三个主要的组件:Logger、Appender 和 Layout。 * Logger:Logger 是 Log4j 的核心组件,负责记录日志信息。Log4j 允许开发人员定义多个 Logger,每个 Logger 拥有自己的名字,Logger 之间通过名字来表明...

    Log4j2效率测试源码

    本测试源码着重关注Log4j2的性能表现,这对于理解和优化日志系统的性能至关重要。Log4j2的设计目标是提供比其前一代Log4j更高的性能,并且具有更丰富的配置选项和更低的内存占用。 1. **Log4j2架构与性能优势** - ...

    log4j-1.2.13-src

    总之,Log4j-1.2.13源码的分析不仅能够加深我们对日志处理的理解,还可以学习到优秀的设计模式和架构思想,是Java开发者的宝贵学习资源。在实际工作中,结合源码可以更好地定制和优化日志记录,提升软件的可维护性和...

    Log4j2、Fastjson、Log4j的BurpSuite插件亲测有效

    Log4j、Log4j2和Fastjson是Java开发中常用的三个库,它们在软件开发中扮演着重要的角色。Log4j是Apache的一个开源项目,主要用于日志记录,提供了灵活的日志配置,允许开发者根据需求调整日志输出的级别和格式。Log4...

    apache-log4j-1.2.17源码

    5. **源码分析** - `org.apache.log4j.Logger`类是所有日志记录的起点,它实现了日志记录的基本方法,如`debug()`, `info()`, `warn()`等。 - `org.apache.log4j.Category`是`Logger`的旧名称,两者在源码中是等价...

    asp.net Log4j源码

    在ASP.NET中实现Log4j源码,通常涉及到以下几个关键知识点: 1. 日志级别:Log4j支持多个日志级别,如DEBUG、INFO、WARN、ERROR和FATAL。开发者可以根据不同的情况选择合适级别的日志,以便在需要时过滤不重要的...

    log4j 1.2.8 jar 包含源码

    **Log4j 1.2.8 源码解析** Log4j 是一个广泛使用的 Java 日志框架,由 Apache 软件基金会开发。它为应用程序提供了灵活的日志记录功能,允许开发者调整日志级别,定制日志格式,以及将日志输出到不同的目的地,如...

    Log4j2异步写日志效率测试源码

    本文主要探讨Log4j2异步写日志的效率,通过源码分析和测试来展示其优势。首先,我们要理解Log4j2中的异步日志工作原理。默认情况下,Log4j2使用同步模式记录日志,即每个日志事件都会阻塞直到写入完成。然而,通过...

    log4j源码二次开发-集中处理日志消息

    总的来说,通过`log4j`源码的二次开发和`DatagramSocket`的使用,我们可以构建一个高效、可扩展的日志管理系统,实现对多应用、多模块日志的集中处理和有序管理,便于故障排查和数据分析。这种方案尤其适用于分布式...

    Log4j将System.out搞到log4j中输出四

    在《Log4j将System.out搞到log4j中输出四》这篇博文中,作者可能详细讨论了这些步骤,并可能分享了一些实战经验。通过学习这篇博文,读者可以更深入地了解如何在实际项目中实现这一转换,提升日志管理的效率。 总结...

    log4net源码

    **log4net源码分析** `log4net`是一款广泛使用的日志记录框架,它源自Java平台上的log4j,并被移植到了.NET环境中。这款开源库提供了强大的日志记录功能,支持多种输出方式,如控制台、文件、数据库等,且具有可...

    Log4j2异步写日志源码

    在Java开发中,日志记录是一项至关重要的任务,它帮助我们追踪程序运行状态,定位问题。Log4j2是Apache提供的一款强大且灵活的日志框架,它的...通过以上分析,我们可以看到Log4j2在实现高效日志管理方面的强大能力。

    log4j简单使用

    "源码"标签暗示我们将讨论Log4j的内部机制或如何查看和理解其代码,这对于学习和定制Log4j功能很有帮助。而"工具"标签则表明Log4j是一个开发者常用的工具,它的使用和配置是提高开发效率的关键。 **压缩包文件名称...

Global site tag (gtag.js) - Google Analytics