先看下面的代码:加入了common-logging的jar包
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class MyTest2 {
static Log log = LogFactory.getLog(MyTest2.class);
public void log() {
log.debug("Debug info.");
log.info("Info info");
log.warn("Warn info");
log.error("Error info");
log.fatal("Fatal info");
}
/**
*
* @param args
*
*/
public static void main(String[] args) {
MyTest2 test = new MyTest2();
test.log();
}
}
1 日志信息分为五个等级
引用
all < debug < info < warn < error < fatal < off
2 继承思想
1) 也就是一个Log可以继承另外一个Log的属性(输出到哪里,日志等级,日志格式等等)
2) 实现方式就是如下:
Log4j是根据Log的名字来判断继承关系的,比如:
名字为“com.zhlmmc.lib”的Log就是“com.zhlmmc.lib.log”的parent,明白了吧!Log4j还有一个rootLogger,相当于Java的Object。
回过头来看“LogFactory.getLog(MyTest2.class)”这里的“MyTest2.class”事实上传进去的是Test这个类的完整路径(包名+类名),“MyTest2.MyTest2”,这样如果存在“MyTest2”这个Log那么MyTest2这个Log就继承它,否则就继承rootLogger。
3 关于logger的两点说明
1)用同名参数调用Logger.getLogger(String name)将返回同一个logger的引用。故可以在一个地方配置logger,在另外一个地方获得配置好的logger,而无须相互间传递logger的引用。
2)logger的创建可以按照任意的顺序,即,父logger可以后于子logger被创建。log4j将自动维护logger的继承树。
4 常见的配置文件
虽然可以用xml或者在运行时用Java来配置Log4j,但还是properties文件好用啊!
引用
log4j.rootLogger=info, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
分析一下:
第一行,配置log4j.rootLogger你明白吧。应为它是根,总得配置一下,否则别的Log继承什么啊。其他的Log可以配置也可以不配置。等号后面的第一个参数表示日志级别,可以填五个级别中的一种,后面的参数都是让Log知道输出到哪里,如果你想让日志输出到两个地方就加两个输出参数,比如:
log4j.rootLogger=info, stdout, file
这里的info表示,该Log的日志级别为info,所有级别小于info的日志都不会被记录。比如使用这个配置文件的话,我刚开始举的那个类中
log.debug("Debug info.");
这句话是不起作用的,因为debug的级别小于info。这样就很容易控制什么信息在调试的时候要显示,什么信息在发布的时候要去掉。这些都不用改代码,很方便吧。
但,stdout和file又是什么呢?
接着往下看,就是配置stdout了,这个名字是随便取的,你可以叫它A:
log4j.appender.A=org.apache.log4j.ConsoleAppender
那么上面的rootLogger的参数stdout也要改成A,其他用到的地方当然也要改。这里的关键不是名字,而是appender类型,比如这里的“ConsoleAppender”,看明白了吧,输出到Console。后面两行都是设置日志格式的,一般情况下你就照抄吧。既然是最简入门关注于理解Log4j的工作原理,我就不介绍file类型的appender了,一搜一大把。
在实际的项目开发中,很可能遇到所引用的包用Log4j来记录日志,比如Hibernate。那么在这里你可以很容易的控制这个包如何记录日志。比如在上面的配置文件中加一行:
log4j.logger.org.hibernate=fatal
那么所有org.hibernate包下面的类就只会显示很少的信息,因为fatal的级别最高啊。
5 默认的log4j初始化过程
Logger类的静态初始化块(static initialization block)中对log4j的环境做默认的初始化。注意:如果程序员已经通过设置系统属性的方法来配置了log4j环境,则不需要再显式地调用XXXConfigurator.configure()方法来配置log4j环境了。
Logger的静态初始化块在完成初始化过程时将检查一系列log4j定义的系统属性。它所做的事情如下:
1) 检查系统属性log4j.defaultInitOverride,如果该属性被设置为false,则执行初始化;否则(只要不是false,无论是什么值,甚至没有值,都是否则),跳过初始化。
2)把系统属性log4j.configuration的值赋给变量resource。如果该系统变量没有被定义,则把resource赋值为"log4j.properties"。注意:在apache的log4j文档中建议使用定义log4j.configuration系统属性的方法来设置默认的初始化文件是一个好方法。
3)试图把resource变量转化成为一个URL对象url。如果一般的转化方法行不通,就调用org.apache.log4j.helpers.Loader.getResource(resource, Logger.class)方法来完成转化
4)如果url以".xml"结尾,则调用方法DOMConfigurator.configure(url)来完成初始化;否则,则调用方法PropertyConfigurator.configure(url)来完成初始化。如果url指定的资源不能被获得,则跳出初始化过程
6 Log4j的编码习惯
1)让每个类都拥有一个private static的Logger对象,用来输出该类中的全部日志信息
2)使用xml文件来完成对log4j环境的配置。在项目的main class中的静态初始化块里放log4j环境的配置代码。注意:在一个项目中,log4j环境只需要被配置一次,而不是在每个使用了logger的类里都需要调用一次
3)用MyClass.class作为参数创建该类的静态Logger对象
分享到:
相关推荐
本文将深入探讨"log4j.jar"和"commons-logging.jar"这两个在Java编程环境中广泛使用的日志库。 **log4j.jar** `log4j`是Apache软件基金会的一个开源项目,它为Java应用程序提供了一种灵活的日志记录框架。这个框架...
本文将深入探讨`log4j.jar`和`common-logging.jar`这两个著名的Java日志库,以及它们在Java应用中的作用。 首先,`log4j.jar`是由Apache软件基金会开发的日志框架,它是Log4j项目的组成部分。Log4j是Java平台上的一...
用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志库。当然,common-logging内部有一个Simple logger的...
4. **配置日志实现**:`common-logging`通过查找类路径中的特定文件(如`log4j.properties`或`logging.properties`)来确定使用哪个日志实现。如果没有找到,它会默认使用`java.util.logging`。如果你希望使用其他...
今天我们将聚焦两个流行的日志框架——SLF4J(Simple Logging Facade for Java)和Logback,以及它们与Log4j和Commons-Logging的对比。 SLF4J是一个接口层的日志框架,它提供一个统一的API,允许用户在运行时插入...
标题中的“Log4j与common-logging”涉及的是两种广泛使用的Java日志框架。Log4j是Apache软件基金会的一个开源项目,它为Java应用程序提供了一种灵活的日志记录机制。而common-logging则是Apache Commons的一个组件,...
将`Common-Log`与`log4j2`结合使用,首先需要在项目中引入`Common-Log`的接口库和`log4j2`的实现库。在Maven项目中,可以在pom.xml文件中添加以下依赖: ```xml <groupId>commons-logging <artifactId>commons...
通过抽象出一个通用的日志接口,开发人员可以在运行时选择不同的日志实现,如log4j、java.util.logging或者Apache Log4j等,而无需修改代码。这使得项目具有更好的灵活性和可移植性。 在Commons Logging 1.1.1中,...
《深入理解Apache Commons Logging》 Apache Commons Logging,简称Commons Logging,是Java世界中一个广泛使用的日志抽象层。这个库被设计为一个轻量级的日志接口,它允许应用程序在不修改代码的情况下切换到不同...
* org.apache.commons.logging.impl.Log4JLogger 使用 Log4J * org.apache.commons.logging.impl.LogKitLogger 使用 avalon-Logkit * org.apache.commons.logging.impl.SimpleLog common-logging 自带日志实现类 ...
这个库的主要目标是为Java应用程序提供一个简单、统一的接口来使用各种日志框架,如log4j、Java内置的日志API(java.util.logging)或简单的控制台输出。在本文中,我们将深入探讨Commons Logging的核心概念、主要...
4. **Slf4j** - 日志门面,允许用户在运行时选择不同的日志实现,如Common-Logging或Log4j,提供了统一的API进行日志记录。 5. **MySQL** - 常用的关系型数据库管理系统,用于存储应用的数据。 在搭建项目时,首先...
log4j.properties ,commons-logging-1.2.jar,log4j-1.2.16.jar,三个文件一起组成一个完整的日志输出,Apache的Common Logging只是一个高层的日志框架,本身并没有实现真正的写日志能力,而是依赖其它的日志系统如...
3. **特定的Log4j-Kafka适配器**:为了使Log4j能够与Kafka进行通信,还需要一个中间件库,比如`log4j-kafka-appender.jar`或`log4j-appender-kafka-*.jar`,具体取决于你选择的实现。 在实际项目中,你可能需要将...
Commons Logging通过提供一个抽象层,允许开发者使用简单的API来记录日志,而具体的日志实现(如Log4j、Java Util Logging或SLF4J)可以根据项目需求或者环境配置进行选择和切换。 Commons Logging的核心概念包括...
Commons Logging提供了统一的日志接口,使得开发者能够在不修改代码的情况下切换不同的日志实现,如Log4j、java.util.logging(JUL)或Apache Logkit等。这种灵活性使得项目在不同环境下的日志配置更加方便,降低了...
标题中的“日志框架学习之一:commons-logging+log4j”揭示了本文将探讨的是在Java开发中常用的两个...总的来说,学习和理解commons-logging与log4j的结合使用,对于提升Java应用的可维护性和问题排查能力至关重要。
用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志库。当然,common-logging内部有一个Simple logger的...
Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的... Because we use commons-logging you are free to choose your logging implementation (Log4j is a common choice).