设为首页 加入收藏

TOP

Log4j配置详解(一)
2014-11-23 19:23:09 】 浏览:649
Tags:Log4j 配置 详解

Log4j是最常用的日志记录工具,下面在介绍其配置方式的同时,还会讲解其中的原理和使用技巧。

1. XML配置


一直觉得xml配置文件更清晰一些,所以从xml开始讲起。首先给出一个最简配置的log4j.xml
< xml version="1.0" encoding="UTF-8" >





















先来看文件下方配置的两个logger,每个logger对应记录日志的一个输入,它们以name进行区分,使用相同name的logger打下的日志一定在同一个日志文件中。其中一个特殊的logger叫做root,它是不需要指定name且一定存在的logger。为了对照此处配置了另一个logger test。
文件上方的appender则对应日志文件的输出,即写入哪个文件、用什么样的格式等。这里配置的appender一个向控制台输出,一个向指定文件输出(test.log)。
其实Log4j的核心概念就这么两个,可以看到logger和appender是引用关系,一个logger可以向多个appender输出,一个appender可以被多个logger共同使用。
下面来看一下如何在Java使用logger
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;


publicclassLog4jTest{


publicstaticvoid main(String[] args){
DOMConfigurator.configure("log4j.xml");


//PropertyConfigurator.configure("log4j.properties");



Logger root =Logger.getRootLogger();
Logger test =Logger.getLogger("test");


System.out.println(root.getName());
System.out.println(test.getName());


root.info("Root Log");
test.info("Test Log");
}


}


我们会看到root logger的name就是root,"Root Log"会被输出到控制台,"Test Log"既会被写入test.log,也会输出到控制台。这里要说明的一点是,所有非root的logger都有一个additivity属性,默认为true,它们记录的日志都会在root logger输出一份。

2. properties配置
log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=%m%n


log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern=%m%n


log4j.rootLogger=DEBUG, consoleAppender
log4j.logger.test=DEBUG, fileAppender


通过和上面xml配置的对比,不难理解其中的含义。不同的是配置logger时必须指定Level,这里设置的是DEBUG。
此外加载配置文件的类也有所不同,使用的是 PropertyConfigurator.configure("log4j.properties");

3. 代码配置
实际上Log4j可以不使用配置文件,直接在代码中进行配置。与上述配置文件等价的代码配置如下
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.RollingFileAppender;


publicclassLog4jTest{


publicstaticvoid main(String[] args){
ConsoleAppender consoleAppender =newConsoleAppender();
consoleAppender.setName("consoleAppender");
consoleAppender.setLayout(newPatternLayout("%m%n"));
consoleAppender.activateOptions();


RollingFileAppender fileAppender =newRollingFileAppender();
fileAppender.setName("fileAppender");
fileAppender.setFile("test.log");
fileAppender.setLayout(newPatternLayout("%m%n"));
fileAppender.activateOptions();


Logger root =Logger.getRootLogger();
root.addAppender(consoleAppender);



Logger test =Logger.getLogger("test");
test.addAppender(fileAppender);


System.out.println(root.getName());
System.out.println(test.getName());


root.info("Root Log");
test.info("Test Log");
}


}


这里注意一定要执行Appender的activateOptions()方法,否则对Appender的配置不会生效。

4. WebApp中log4j的配置
在Java Web工程的web.xml添加加载Log4j配置文件的Listener
< xml version="1.0" encoding="UTF-8" >
java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">


MyApp



log4jConfigLocation
/WEB-INF/log4j.xml



org.springframework.web.util.Log4jConfigListener



这是一种比较简便的方法,不过需要依赖Spring。如果有其他的方式欢迎留言告诉我一下。

最后说一下代码中logger的使用方式,实际上Logger.getLogger("name")中的name,不一定要是配置文件中声明的logger,你可以随时get出一个任意name的lo

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Go 语言使用 TCP keepalive 下一篇创建一个跟分辨率无关的 iOS 8 应..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目