`
wsmajunfeng
  • 浏览: 497374 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

各种log的加载过程

 
阅读更多

1. 概述

现在的log框架越来越多,目前我们系统用有使用的包括commons-logging,log4j,slf4j(还有 一个号称更快的logback暂时基本没有用到),而这些log系统又常常依赖于一些jar包顺序和静态配置,导致比较混乱,甚至出现一些难以重现的诡异 问题,因此在这里就各个log系统的初始化过程介绍一下,方便以后排查问题。
本文主要侧重多个日志系统的混合使用和加载,对于日志级别,格式等等方面不涉及。

2. 介绍

2.1. commons-logging

apache提供的日志门面接口,主要是为了避免程序和具体的log耦合。

基本使用方法:

首先需要引入commons-logging.jar(通过maven或者其他方法皆可),然后这样使用就可以了

  1. Log logger = LogFactory.getLog(TestCommonsLogging.class);
  2. logger.debug(“test debug”);

初始化过程:

其中LogFactory是实现解耦的关键,他使用log系统的查找顺序是这样的:
1. 寻找当前factory中名叫org.apache.commons.logging.Log配置属性的值。注意值可以通过java代码设置,但更多的是 在classpath中提供一个交commons-logging.properties的文件,设置在里面,比 如:org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog
如果classpath中有多个文件,在1.1版本之前,使用找到的第一个,1.1版本及其以后会在配置文件中定义一个优先级,使用优先级最高的。
2. 寻找系统中属性中名叫org.apache.commons.logging.Log的值。
3. 如果应用程序的classpath中有log4j,则使用相关的包装(wrapper)类(Log4JLogger)
4. 如果应用程序运行在jdk1.4的系统中,使用相关的包装类(Jdk14Logger)
5. 使用自带的简易日志包装类(SimpleLog)

2.2 slf4j

slf4j和commons-logging功能类似

基本使用方法:

首先要引入slf4j-api-1.6.4jar,然后比如要支持log4j,就引入slf4j-log4j12-1.6.4jar

  1. Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
  2. logger.debug(“test debug”);

初始化过程:

SLF4J没有通过配置文件来指明使用哪个log,而是通过引入适配jar包来指定。如果引入了两个桥接包,就看谁在classpath的前面了。(事实 上,每个桥接包中都有一个同名类org.slf4j.impl.StaticLoggerBinder,通过 org.slf4j.LoggerFactory的静态代码块加载
loggerFactory = StaticLoggerBinder.SINGLETON.getLoggerFactory();)


2.3 log4j

这个就不用介绍了,大家都懂的。

基本使用方法

  1. Logger logger =org.apache.log4j.Logger.getLogger(Log4jTest.class);
  2. logger.debug(“test debug”);

初始化过程:

1.检查系统变量Log4j.configuration,如果有值,使用这个值设定的配置文件,否则先尝试在classpath中加载 log4j.xml,没有再尝试加载log4j.properties.找到对应的配置文件后,调用对应的DOMConfigurator或者 PropertyConfigurator来初始化
configurator.doConfigure(url, hierarchy);
2.如果都没有配置,那么需要在应用中显示调用DOMConfigurator或者PropertyConfigurator来初始化。
3.如果在程序执行的过程中,代码调用了一次XXXConfigurator.configure(),所有对应的logger的设置都会随之改变。

3. 分析一个实际例子

我们在启动jetty的时候,jetty用的是slf4j,我们在lib中放置了slf4j-api-1.6.4jar,slf4j-log4j12-1.6.4jar和log4j.properites,所以会使用log4j打印log。

在应用起来的过程中,由于是自己的classloader,不会复用jetty本身的log配置,首先加载的 是,dragoon的filter用了slf4j,而这个时候应用的log4j系统还没有初始化,于是就在类路径的jar包中随便找到了第一个 log4j.prpperties,然后正好输出到了控制台。(因此在启动中有几行dragoon的控制台输出)

servelt初始化后,webx利用commons-logging包装了log4j,在war包的WEB-INF下查找log4j配置文件并使用,覆 盖掉开始dragoon初始化的log4j提醒,这样在应用中所有的log4j都会使用新的这套配置了。因此除了系统的应用代码外,二方库和3方库如果使 用了log4j,commons-logging和slf4j的方式打log,都会使用我们WEB-INF下的log4j配置。未特殊设置的,都会打印到 root对应的appender上面去。

 

4. 参考文献:

http://commons.apache.org/logging/commons-logging-1.1.1/guide.html
http://www.slf4j.org/manual.html
http://logging.apache.org/log4j/1.2/manual.html

分享到:
评论

相关推荐

    Qualcomm平台开发如何抓取Log

    Kernel LOG是记录系统启动过程中的信息,包括系统启动、模块加载、错误信息等。使用以下命令可以查看kernel LOG: `adb shell dmesg > d:\kerneltestlog.txt` 其中,`dmesg`命令用于显示kernel LOG,`> d:\...

    weblogic类加载过程简述

    下面我们将详细探讨WebLogic的类加载过程。 1. **类加载器层次结构** WebLogic的类加载器体系遵循“父类加载器优先”原则,这意味着当一个类加载请求发生时,首先由父类加载器尝试加载,只有在其无法找到相应类时...

    ApexSQllog2014,SQL数据库日志查询软件

    总的来说,ApexSQL Log 2014是SQL数据库管理员的得力助手,它将复杂的交易日志解析和数据恢复过程简化,使得数据库管理和维护变得更加高效和安全。对于任何需要深入了解SQL Server数据库变更历史或者需要执行数据...

    log4net-2.0.8-src_log4net源代码_log4net_

    - 应用程序启动时,通常会调用`log4net.Config.XmlConfigurator.Configure()`方法加载并解析配置文件,初始化log4net系统。 4. **使用方式** - 使用`log4net.ILog`接口在代码中创建Logger实例,并通过`Info()`, `...

    tomcat下的log4j日志配置

    1. **安装 Log4j 库**:在 Tomcat 的 `common/lib` 目录下添加 Log4j 的 `.jar` 文件,确保 Tomcat 能够识别并加载 Log4j 库。 2. **配置全局 Log4j 属性文件**:在任意位置创建 `log4j.properties` 文件,并设置...

    unity3d_Log

    因此,需要手动下载log4net的DLL,并将其放入项目的Plugins目录下,确保其在运行时被加载。 接下来,我们需要配置log4net。在Unity3D项目中,通常会在一个初始化脚本(如`Start()`方法)中进行配置。配置涉及定义...

    log4j日志报错解决办法

    在Java开发过程中,如果遇到"log4j:WARN Please initialize the log4j system properly"这样的错误提示,通常意味着Log4j没有正确配置或者找不到配置文件。 首先,错误信息"log4j:WARN No appenders could be found...

    .net log4jdemo log4j日志

    总的来说,Log4jDemo为.NET开发者提供了一种灵活的日志记录解决方案,使得在各种复杂情况下都能有效地管理和分析日志数据。通过熟悉和掌握Log4j的使用,开发者可以提升项目的可维护性,同时也能更好地应对调试和故障...

    log4d Delphi中好用的轻量级日志类

    在Delphi编程环境中,...总之,log4d为Delphi开发者提供了一套高效、易用的日志解决方案,它的灵活性和可扩展性使其成为开发过程中的得力工具。通过理解和掌握log4d的使用,可以极大地提升代码的可维护性和调试效率。

    LOG4CPP多个日志文件

    1. DEBUG:调试信息,通常用于开发过程,帮助定位问题。 2. NOTICE:普通信息,记录应用程序的正常流程。 3. WARNING:警告信息,表明程序遇到了非致命性问题,可能需要用户注意。 4. ERROR:错误信息,表示程序运行...

    log4j(二):动态配置日志输出路径

    在Web应用中,如使用的是Servlet环境,可以通过在`web.xml`中配置`ContextLoaderListener`来加载Log4j配置,同时,我们还可以创建一个Servlet,当接收到特定请求时,更新Log4j配置。 ```xml <!-- web.xml 示例 --> ...

    log4j 介绍

    Log4j的启动过程通常会在程序中自动进行,如果没有显式初始化Log4j配置文件,LogManager类中的静态块会在classpath目录下查找log4j.xml文件或log4j.properties文件。如果需要自定义配置文件的路径,可以使用...

    安卓平台so打印log

    当SO文件加载并执行时,这些LOG会被发送到Android系统的日志系统,并可以通过adb(Android Debug Bridge)工具或者Android Studio的Logcat视图进行查看。例如,使用adb命令行工具,你可以输入以下命令查看名为...

    应用log4net写日志的简单程序

    在这个例子中,我们首先通过`[assembly: log4net.Config.XmlConfigurator(Watch = true)]`注解告诉log4net从配置文件中加载设置,并监视配置文件的变化。然后,我们使用`LogManager.GetLogger`获取一个logger实例,...

    log4j详细配置说明

    更重要的是,Log4j 通过定义日志级别(例如 FATAL、ERROR、WARN、INFO 和 DEBUG),使开发者能够更精细地控制日志信息的生成流程。 Log4j 的核心优势在于它允许通过外部配置文件来调整日志行为,而无需改动应用程序...

    Log4Net使用demo Log4Net.dll

    通常,初始化过程包括在AssemblyInfo.cs文件中添加`[assembly: log4net.Config.XmlConfigurator(Watch = true)]`,这样Log4Net会自动从应用程序配置文件(如app.config或web.config)中读取配置信息。 配置文件是...

    Log4jNET实例

    Log4j.NET实例通常用于帮助开发者在应用程序中记录各种级别的日志信息,如调试信息、警告、错误和致命错误,以便于追踪程序问题、优化性能和确保系统的可维护性。 在开发过程中,Log4j.NET实例的应用通常包含以下几...

    log4j学习

    5. **自定义Servlet初始化Log4j**:创建一个自定义的Servlet,如`Log4jInit`,在`init()`方法中使用`PropertyConfigurator.configure()`来加载`log4j.properties`配置。 #### 总结 通过以上步骤,我们可以在Java...

    使用Log4net发送日志邮件实例

    配置Log4net是关键步骤,这通常在应用程序的启动过程中完成。例如,在全局.asax的`Application_Start`方法中,你可以加载XML配置文件,其中定义了日志的输出方式。一个基本的配置可能如下: ```xml <log4net> ...

    log4qt qt5版本

    首先,原始的log4qt在某些情况下可能需要直接将库文件加载到工程中,对于大型项目或者需要频繁调整配置的情况,这种方式可能会显得不够灵活。描述中提到的改动是针对这个问题进行的优化,增加了类的导出,使得这个库...

Global site tag (gtag.js) - Google Analytics