歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Log4j配置詳解

Log4j是最常用的日志記錄工具,下面在介紹其配置方式的同時,還會講解其中的原理和使用技巧。
 
1. XML配置

    一直覺得xml配置文件更清晰一些,所以從xml開始講起。首先給出一個最簡配置的log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configurationxmlns:log4j="http://jakarta.apache.org/log4j/">
<appendername="consoleAppender"class="org.apache.log4j.ConsoleAppender">
<layoutclass="org.apache.log4j.PatternLayout">
<paramname="ConversionPattern"value="%m%n"/>
</layout>
</appender>

<appendername="fileAppender"class="org.apache.log4j.RollingFileAppender">
<paramname="File"value="test.log"/>
<layoutclass="org.apache.log4j.PatternLayout">
<paramname="ConversionPattern"value="%m%n"/>
</layout>
</appender>

<root>
<appender-refref="consoleAppender"/>
</root>

<loggername="test">
<appender-refref="fileAppender"/>
</logger>
</log4j:configuration>

先來看文件下方配置的兩個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"?>
<web-appversion="2.5"xmlns="http://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">

<display-name>MyApp</display-name>

<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

</web-app>

這是一種比較簡便的方法,不過需要依賴Spring。如果有其他的方式歡迎留言告訴我一下。
 
最後說一下代碼中logger的使用方式,實際上Logger.getLogger("name")中的name,不一定要是配置文件中聲明的logger,你可以隨時get出一個任意name的logger,只不過這個logger沒有配置appender,並且additivity=true,它記錄的日志會輸出到root logger的appender中。因此你經常可以看到代碼中這樣來寫
privateLogger logger =Logger.getLogger(Log4jTest.class);


privateLogger logger =Logger.getLogger(this.getClass());

這些logger真正的name是具有完整包名的參數類的名稱,如cn.gaofeihang.demo.Log4jTest。這樣做的好處是,通過配置日志格式,可以在打日志時記錄產生日志的類名稱,便於排查問題。
 
這是一篇不太一樣的配置說明,意在講解配置背後的一些原理和技巧。關於log4j各個配置項的使用方法,網上已有很多介紹,就不再贅述。

Log4j入門使用教程 http://www.linuxidc.com/Linux/2013-06/85223.htm

Log4j 日志詳細用法 http://www.linuxidc.com/Linux/2014-09/107303.htm

Hibernate配置Log4j顯示SQL參數 http://www.linuxidc.com/Linux/2013-03/81870.htm

Log4j學習筆記(1)_Log4j 基礎&配置項解析 http://www.linuxidc.com/Linux/2013-03/80586.htm

Log4j學習筆記(2)_Log4j配置示例&Spring集成Log4j http://www.linuxidc.com/Linux/2013-03/80587.htm

Log4j 的詳細介紹:請點這裡
Log4j 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved