log4j的各种类的配置

log4j看上去像是一种简单的,易配置的日志打印技术。但是实际使用的时候发现,还有各种很相似的日志技术。很多地方的配置一乱就不知道怎么对应了。所以应该把log4j的一切做个简单的分类记录。

(一)java.util.logging.Logger

这个在java的util包里面,不需要任何Maven依赖,是最最基本的日志打印。功能很不完善,基本没有人在大型软件中使用这个。

示例代码:(日志重要级从上往下递增)

 1 public class TestLog {
 2     public static void main(String[] args) {
 3         Logger logger = Logger.getLogger(TestLog.class.toString());
 4         logger.log(Level.ALL, "ALL");
 5         logger.log(Level.FINEST, "FINEST");
 6         logger.log(Level.FINER, "FINER");
 7         logger.log(Level.FINE, "FINE");
 8         logger.log(Level.CONFIG, "CONFIG");
 9         logger.log(Level.INFO, "INFO");
10         logger.log(Level.WARNING, "WARNING");
11         logger.log(Level.SEVERE, "SEVERE");
12         logger.log(Level.OFF, "OFF");
13     }
14 }

控制台输出:

一月 17, 2017 2:36:23 下午 com.jd.Test.TestLog main
信息: INFO
一月 17, 2017 2:36:23 下午 com.jd.Test.TestLog main
警告: WARNING
一月 17, 2017 2:36:23 下午 com.jd.Test.TestLog main
严重: SEVERE
一月 17, 2017 2:36:23 下午 com.jd.Test.TestLog main禁用: OFF

那么为什么从info开始输出呢?原因是在很多实际应用中会只在控制台打印某个级别以上的日志信息。否则在调试的时候有可能会面对海量的杂乱日志而不知如何下手。所以这里也用了这样的设计。

想要修改默认的日志输出级别的话,去jre安装目录的lib下面:

1 # Limit the message that are printed on the console to INFO and above.
2 java.util.logging.ConsoleHandler.level = INFO

那么,如何制定日志的输出目录呢?这个可以用java代码指定:

 1 public class TestLog {
 2     public static void main(String[] args) throws SecurityException, IOException {
 3         Logger logger = Logger.getLogger(TestLog.class.toString());
 4
 5         FileHandler fileHandler = new FileHandler("/Users/Davie/File/foo.log");
 6         fileHandler.setLevel(Level.ALL);
 7         logger.addHandler(fileHandler);
 8
 9         logger.log(Level.ALL, "ALL");
10         logger.log(Level.FINEST, "FINEST");
11         logger.log(Level.FINER, "FINER");
12         logger.log(Level.FINE, "FINE");
13         logger.log(Level.CONFIG, "CONFIG");
14         logger.log(Level.INFO, "INFO");
15         logger.log(Level.WARNING, "WARNING");
16         logger.log(Level.SEVERE, "SEVERE");
17         logger.log(Level.OFF, "OFF");
18     }
19 }

但是结果是一个xml,比较难debug。

(二)common-logging

首先,它是apache提供的一个通用的日志接口,它的存在的意义是把普遍意义上的日志和真正的日志实现解耦合。那么它本身需要什么配置呢?其实什么都不需要。因为在运行时,它会自动去找实现。这里的实现可能是上文的java.util.logging.Logger这个JDK自带的最基本的日志实现,也可能是使用广泛的Log4j。

首先在Maven加入依赖:

1 <dependency>
2     <groupId>commons-logging</groupId>
3     <artifactId>commons-logging</artifactId>
4     <version>1.1.1</version>
5 </dependency>

然后在java类中写入:

 1 class Foo {
 2
 3     private Log log = LogFactory.getLog(TestLog.class);
 4
 5     public void method() {
 6         // log.debug("debug");
 7         log.info("info");
 8         log.warn("warn");
 9         log.error("error");
10         // log.fatal("fatal");
11     }
12 }

注释的这两行去掉注释是不起作用的。原因是目前只在Maven中添加了common-logging,它会使用JDK的实现,而JDK的实现是没有debug和fatal的。那么问题是到底这个common-logging会使用哪一个Log呢?它会按照如下规则寻找其实现类(转载自:http://jiangzhengjun.iteye.com/blog/520733):

1) 首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类;

2) 如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类;

如果在Tomact中可以建立一个叫 :CATALINA_OPTS 的环境变量 
给 他的 值 : - Dorg.apache.commons.logging.Log = org.apache.commons.logging.impl.SimpleLog - Dorg.apache.commons.logging.simplelog.defaultlog = warn

3) 否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类;

4) 否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);

5) 否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog;

这样呢,往往就可以保证按照用户的意愿实现log。

另外,以上的Maven依赖中如果加入了log4j相关的的依赖,反倒会在运行时报错,原因是common-logging发现了log4j,所以会使用log4j进行输出,但是这个时候log4j还没有配置于是会输出:

log4j:WARN No appenders could be found for logger (com.jd.logTest.Foo).

log4j:WARN Please initialize the log4j system properly.

log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

(三)SLF4j

这个其实也是一种接口。它自己不实现任何真正的日志打印,而是通过再引入别的包来转换。它的最特别的好处有两个,第一是可以通过占位符来打印日志,第二是配置具体实现简单且解耦合。

对于第一点,在日志系统的使用中,往往不只是要打印出:“**异常”,还要打印出具体的异常,和异常产生时的参数环境。最简单的例子如下:

1     public void say(String word) {
2         if (word == null) {
3             log.error("输入参数异常,word:" + word);
4             return ;
5         }
6         System.out.println(word);
7     }

这样的问题是,当要打印的参数多时,要产生多个String对象。其次是代码很不直观。

对于第二点,如果没有使用这个接口,而是直接耦合了log4j。那么如果你在代码中引入了一个模块,而这个模块使用了别的日志系统,那么你就必须在你的代码里面引入那一个日志系统并且配置好,维护好。这很明显引入了不必要的工作。

那么你要怎么才能使用一个SLF4j呢?官网上有一张图:

这张图体现了SLF4j的核心思想:你只需要把正确的包引入你的工程,日志系统就能正常的工作。

那么具体如何使用SLF4j呢?首先,你需要一个最基本的SLF4j的API包:

1 <dependency>
2     <groupId>org.slf4j</groupId>
3     <artifactId>slf4j-api</artifactId>
4     <version>${slf4j.version}</version>
5 </dependency>

这个包提供了SLF4j的基本API。接着,你需要一个“转换的包”。说起转换,当然就能联想到适配器设计模式。这个地方可以理解为一个适配器。这个地方的理解是指宏观的理解:你引入了如果所示的对应的包,就把SLF4j对应的实现包引入,SLF4j就会自动去找这个包的实现。

(四)log4j

这个可以说是最享有大名的一个日志系统。确把很多初学者弄得很迷茫,因为一百度这个日志系统的实现,到处都是使用了各种上文中解耦合的接口。这是工程中常用的做法,但是刚开始确实显得比较杂乱。

--------------未完待续-----------------

时间: 2024-10-23 12:02:50

log4j的各种类的配置的相关文章

log4j.properties 详解与配置步骤(转)

找的文章,供参考使用 转自 log4j.properties 详解与配置步骤 一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR 为严重错误 主要是程序的错误WARN 为一般警告,比如session丢失INFO 为一般要显示的信息,比如登录登出DEBUG 为程序的调试信息 2.配置日志信息输出目的地 log4j.appender.appenderName = fully.qualified.name.of.appender.

Java学习篇之--- log4j.properties 详解与配置步骤

log4j.properties 详解与配置步骤 最近在剖析项目代码,看到日志功能,心血来潮收集整理了一下log4j的用法: 一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUG ERROR 为严重错误 主要是程序的错误 WARN 为一般警告,比如session丢失 INFO 为一般要显示的信息,比如登录登出 DEBUG 为程序的调试信息 2.配置日志信息输出目的地 log4j.appender.appenderName = fully

springmvc+log4j操作日志记录,详细配置

没有接触过的,先了解一下:log4j教程 部分内容来:log4j教程 感谢! 需要导入包: log包:log4j-12.17.jar 第一步:web.xml配置 <!-- log4j配置,文件路径,因为是跟随项目启动 --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.xml</param-value>

使得“Log4J日志文件保存路径”可配置

使用Log4J日志框架,可以配置将日志记录到文件中,示例配置如下: log4j.appender.A1=org.apache.log4j.RollingFileAppender log4j.appender.A1.Threshold=INFO log4j.appender.A1.File=log/info.log log4j.appender.A1.Append=true log4j.appender.A1.Encoding=GBK log4j.appender.A1.MaxFileSize=2

log4j.properties 详解与配置步骤

一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR 为严重错误 主要是程序的错误WARN 为一般警告,比如session丢失INFO 为一般要显示的信息,比如登录登出DEBUG 为程序的调试信息 2.配置日志信息输出目的地 log4j.appender.appenderName = fully.qualified.name.of.appender.class1.org.apache.log4j.ConsoleAppender

log4j.properties 详解与配置步骤总结

先提供一个项目中使用log4j.properties配置 #log4j.rootLogger=WARN, stdout, file log4j.rootLogger=INFO,console,dailyFile ###继承rootLogger-->additivity #log4j.additivity.org.apache=true # 控制台(console) log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appe

【配置】log4j.properties 详解与配置步骤

一.Log4j基本使用方法 Log4j由三个重要的组件构成:[日志信息的优先级],[日志信息的输出目的地],[日志信息的输出格式]. 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度: 日志信息的输出目的地指定了日志将打印到控制台还是文件中: 而输出格式则控制了日志信息的显示内容. 1.1.定义配置文件 其实您也可以完全不使用配置文件,而是在代码中配置Log4j环境.但是,使用配置文件将使您的应用程序更加灵活.Log4j支持两种配置文件格

slf4j 和 log4j合用的(Maven)配置

简述: 添加logger的日志输出,下面是配置信息供备忘   步骤: 1. 在Maven的porn.xml 文件中添加dependency如下 [html] view plaincopy <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.2</version> </dependen

log4j详解(二) XML 配置方式

上一篇文章说到了 log4j 的 properties 的配置方式,虽然感觉区别没有很大,但是 log4j.properties的配置方式里面不能使用 Filter 过滤器来限制日志级别,另一个原因在于 log4j.xml 在插入数据库的时候sql 语句可以放在 layout 属性的 ConversionPattern 参数中,而 log4j.properties 配置起来就显得更加麻烦. 一.步骤    1.引入 jar 包    2.src 下创建 log4j.xml 文件    3.配置头