1.
概述
现在的log框架越来越多,目前我们系统用有使用的包括commons-logging,log4j,slf4j(还有
一个号称更快的logback暂时基本没有用到),而这些log系统又常常依赖于一些jar包顺序和静态配置,导致比较混乱,甚至出现一些难以重现的诡异
问题,因此在这里就各个log系统的初始化过程介绍一下,方便以后排查问题。
本文主要侧重多个日志系统的混合使用和加载,对于日志级别,格式等等方面不涉及。
2.
介绍
2.1. commons-logging
apache提供的日志门面接口,主要是为了避免程序和具体的log耦合。
基本使用方法:
首先需要引入commons-logging.jar(通过maven或者其他方法皆可),然后这样使用就可以了
- Log logger = LogFactory.getLog(TestCommonsLogging.class);
- 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
- Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
- logger.debug(“test debug”);
初始化过程:
SLF4J没有通过配置文件来指明使用哪个log,而是通过引入适配jar包来指定。如果引入了两个桥接包,就看谁在classpath的前面了。(事实
上,每个桥接包中都有一个同名类org.slf4j.impl.StaticLoggerBinder,通过
org.slf4j.LoggerFactory的静态代码块加载
loggerFactory = StaticLoggerBinder.SINGLETON.getLoggerFactory();)
2.3 log4j
这个就不用介绍了,大家都懂的。
基本使用方法
- Logger logger =org.apache.log4j.Logger.getLogger(Log4jTest.class);
- 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
分享到:
相关推荐
- **岩石物理模板**:PowerLog提供了一系列岩石物理模板,帮助用户快速建立和测试不同的岩石物理模型,加速油藏评价过程。 总之,PowerLog软件以其全面的功能、强大的数据管理和分析能力,成为石油勘探与生产领域不...
Kernel LOG是记录系统启动过程中的信息,包括系统启动、模块加载、错误信息等。使用以下命令可以查看kernel LOG: `adb shell dmesg > d:\kerneltestlog.txt` 其中,`dmesg`命令用于显示kernel LOG,`> d:\...
下面我们将详细探讨WebLogic的类加载过程。 1. **类加载器层次结构** WebLogic的类加载器体系遵循“父类加载器优先”原则,这意味着当一个类加载请求发生时,首先由父类加载器尝试加载,只有在其无法找到相应类时...
总的来说,ApexSQL Log 2014是SQL数据库管理员的得力助手,它将复杂的交易日志解析和数据恢复过程简化,使得数据库管理和维护变得更加高效和安全。对于任何需要深入了解SQL Server数据库变更历史或者需要执行数据...
- 应用程序启动时,通常会调用`log4net.Config.XmlConfigurator.Configure()`方法加载并解析配置文件,初始化log4net系统。 4. **使用方式** - 使用`log4net.ILog`接口在代码中创建Logger实例,并通过`Info()`, `...
1. **安装 Log4j 库**:在 Tomcat 的 `common/lib` 目录下添加 Log4j 的 `.jar` 文件,确保 Tomcat 能够识别并加载 Log4j 库。 2. **配置全局 Log4j 属性文件**:在任意位置创建 `log4j.properties` 文件,并设置...
因此,需要手动下载log4net的DLL,并将其放入项目的Plugins目录下,确保其在运行时被加载。 接下来,我们需要配置log4net。在Unity3D项目中,通常会在一个初始化脚本(如`Start()`方法)中进行配置。配置涉及定义...
在Java开发过程中,如果遇到"log4j:WARN Please initialize the log4j system properly"这样的错误提示,通常意味着Log4j没有正确配置或者找不到配置文件。 首先,错误信息"log4j:WARN No appenders could be found...
总的来说,Log4jDemo为.NET开发者提供了一种灵活的日志记录解决方案,使得在各种复杂情况下都能有效地管理和分析日志数据。通过熟悉和掌握Log4j的使用,开发者可以提升项目的可维护性,同时也能更好地应对调试和故障...
在Delphi编程环境中,...总之,log4d为Delphi开发者提供了一套高效、易用的日志解决方案,它的灵活性和可扩展性使其成为开发过程中的得力工具。通过理解和掌握log4d的使用,可以极大地提升代码的可维护性和调试效率。
1. DEBUG:调试信息,通常用于开发过程,帮助定位问题。 2. NOTICE:普通信息,记录应用程序的正常流程。 3. WARNING:警告信息,表明程序遇到了非致命性问题,可能需要用户注意。 4. ERROR:错误信息,表示程序运行...
在Web应用中,如使用的是Servlet环境,可以通过在`web.xml`中配置`ContextLoaderListener`来加载Log4j配置,同时,我们还可以创建一个Servlet,当接收到特定请求时,更新Log4j配置。 ```xml <!-- web.xml 示例 --> ...
Log4j的启动过程通常会在程序中自动进行,如果没有显式初始化Log4j配置文件,LogManager类中的静态块会在classpath目录下查找log4j.xml文件或log4j.properties文件。如果需要自定义配置文件的路径,可以使用...
当SO文件加载并执行时,这些LOG会被发送到Android系统的日志系统,并可以通过adb(Android Debug Bridge)工具或者Android Studio的Logcat视图进行查看。例如,使用adb命令行工具,你可以输入以下命令查看名为...
在这个例子中,我们首先通过`[assembly: log4net.Config.XmlConfigurator(Watch = true)]`注解告诉log4net从配置文件中加载设置,并监视配置文件的变化。然后,我们使用`LogManager.GetLogger`获取一个logger实例,...
更重要的是,Log4j 通过定义日志级别(例如 FATAL、ERROR、WARN、INFO 和 DEBUG),使开发者能够更精细地控制日志信息的生成流程。 Log4j 的核心优势在于它允许通过外部配置文件来调整日志行为,而无需改动应用程序...
通常,初始化过程包括在AssemblyInfo.cs文件中添加`[assembly: log4net.Config.XmlConfigurator(Watch = true)]`,这样Log4Net会自动从应用程序配置文件(如app.config或web.config)中读取配置信息。 配置文件是...
Log4j.NET实例通常用于帮助开发者在应用程序中记录各种级别的日志信息,如调试信息、警告、错误和致命错误,以便于追踪程序问题、优化性能和确保系统的可维护性。 在开发过程中,Log4j.NET实例的应用通常包含以下几...
5. **自定义Servlet初始化Log4j**:创建一个自定义的Servlet,如`Log4jInit`,在`init()`方法中使用`PropertyConfigurator.configure()`来加载`log4j.properties`配置。 #### 总结 通过以上步骤,我们可以在Java...
配置Log4net是关键步骤,这通常在应用程序的启动过程中完成。例如,在全局.asax的`Application_Start`方法中,你可以加载XML配置文件,其中定义了日志的输出方式。一个基本的配置可能如下: ```xml <log4net> ...