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>
<?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