1、log4j的參考配置文件 (以下支持根據級別輸出到特定文件中)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p] %d{yyyy-MM-dd HH\:mm\:ss} %l\: %m%n"/>
</layout>
</appender>
<appender name="DEBUG" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="logs/LottChartStBox_debug.log"/>
<param name="datePattern" value="'.'yyyy-MM-dd"/>
<param name="encoding" value="UTF-8">
<param name="Append" value="true"/>
<param name="MaxFileSize" value="500KB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p] %d{yyyy-MM-dd HH\:mm\:ss} %l\: %m%n"/>
</layout>
</appender>
<appender name="WARN" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="logs/LottChartStBox_warn.log"/>
<param name="datePattern" value="_yyyy-MM-dd"/>
<param name="encoding" value="UTF-8">
<param name="Append" value="true"/>
<param name="MaxFileSize" value="500KB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p] %d{yyyy-MM-dd HH\:mm\:ss} %l\: %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="WARN" />
<param name="LevelMax" value="ERROR" />
</filter></appender>
<!-- <appender name="ERROR" class="org.apache.log4j.DailyMaxRollingFileAppender">
<param name="File" value="logs/LottChartStBox_error.log"/>
<param name="Append" value="true"/>
<param name="DatePattern" value="LottChartStBox_error_'yyyy-MM-dd'.log" />
<param name="encoding" value="UTF-8">
<param name="MaxFileSize" value="500KB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p] %d{yyyy-MM-dd HH\:mm\:ss} %l\: %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="ERROR" />
</filter> </appender> -->
<root>
<priority value="debug"/>
<appender-ref ref="STDOUT"/>
<appender-ref ref="DEBUG"/>
<appender-ref ref="WARN"/>
<!-- <appender-ref ref="ERROR"/> -->
</root>
</log4j:configuration>
2、log4j的文件的放置於調用
在log4j.jar中,有個初始化類org.apache.log4j.LogManager . 它有個靜態代碼塊,指明瞭調用配置文件的先後順序如下 :
static
{
Hierarchy h = new Hierarchy(new RootLogger(Level.DEBUG));
repositorySelector = new DefaultRepositorySelector(h);
String override = OptionConverter.getSystemProperty("log4j.defaultInitOverride", null);
if ((override == null) || ("false".equalsIgnoreCase(override)))
{
String configurationOptionStr = OptionConverter.getSystemProperty("log4j.configuration", null);
String configuratorClassName = OptionConverter.getSystemProperty("log4j.configuratorClass", null);
URL url = null;
if (configurationOptionStr == null)
{
url = Loader.getResource("log4j.xml");
if (url == null) {
url = Loader.getResource("log4j.properties");
}
}
else
{
try
{
url = new URL(configurationOptionStr);
}
catch (MalformedURLException ex)
{
url = Loader.getResource(configurationOptionStr);
}
}
if (url != null)
{
LogLog.debug("Using URL [" + url + "] for automatic log4j configuration.");
try
{
OptionConverter.selectAndConfigure(url, configuratorClassName, getLoggerRepository());
}
catch (NoClassDefFoundError e)
{
LogLog.warn("Error during default initialization", e);
}
}
else
{
LogLog.debug("Could not find resource: [" + configurationOptionStr + "].");
}
}
}
說明:
1、OptionConverter.getSystemProperty() 等用於 System.getProperty()
2、如果系統屬性配置了“log4j.defaultInitOverride”且不是false(默認爲null),那麼就不會自動加載配置文件,必須手動調用org.apache.log4j.PropertyConfigurator.configure(xxxx)方法來自己手動加載文件屬性
3、沒有配置“log4j.defaultInitOverride”,那麼就會先在系統屬性"log4j.configuration"所指定的路徑下去查找配置文件,找到就加載,找不到就拉倒
4、如果沒有“log4j.defaultInitOverride” 和 "log4j.configuration" ,就會在項目classpath下去找,優先找到log4j.xml,再找log4j.properties,先找到哪個就加載哪個
5、第一次獲得logger對象後,就會放入緩存,後面取的將都是緩存裏面的值 (注意,如果第一次構建對象時還沒有加載到配置文件,及時後面系統加載了配置文件也不生效了,還有,謹防jar包裏面的log4j配置文件的影響)
3、日誌的輸出
我們調用一般會用2個 :
org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(Class); //來源於 commons-logging.jar
org.apache.log4j.Logger logger = org.apache.log4j.LogManager.getLogger(Class); //來源於log4j.jar
關係 :
org.apache.commons.logging.Log 繼承於(extends) org.apache.log4j.Logger;
org.apache.commons.logging.LogFactory.getLog(Class);這個方法最終也是調用了org.apache.log4j.LogManager.getLogger(Class)的方法生成logger對象 。
不過 org.apache.commons.logging.LogFactory.getLog(Class) 這個是包裝了一層緩存,而 org.apache.log4j.LogManager.getLogger(Class)沒有緩存 。 那麼效率就肯定低下好多,且會new多個對象
請使用
org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(Class); //來源於 commons-logging.jar