1、log4j.xml放在工程 WEB-INF下
<?xml version="1.0" encoding="gbk" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="false"
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="%-4r [%t] %-5p %c %x - %m%n"/>
</layout>
<!--
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="FATAL" />
<param name="LevelMax" value="FATAL" />
-->
</filter>
</appender>
<!-- 配置程序调试时的日志输出,输出到文件,并且文件按天存放 -->
<appender name="DEBUG"
class="com.zlz.utils.DatedFileAppender">
<param name="Encoding" value="UTF-8" />
<!-- 调试日志文件存放在log/debug目录下 -->
<param name="File" value="${root}/WEB-INF/log/%yyyy/%mm/%dd/debug.log" />
<!-- 重启后追加到旧文件 -->
<param name="Append" value="true" />
<!-- 按天分割文件 -->
<!-- param name="DatePattern" value=".yyyy-MM-dd" /-->
<!-- 配置日志格式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%c %d -- %p -- %m%n" />
</layout>
<!-- 配置过滤器,此文件只输出DEBUG信息 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="DEBUG" />
</filter>
</appender>
<!-- 配置程序运行时的日志输出,输出到文件,并且文件按天存放 -->
<appender name="INFO"
class="com.zlz.utils.DatedFileAppender">
<param name="Encoding" value="UTF-8" />
<!-- 事件日志文件存放在log/info目录下 -->
<param name="File" value="${root}/WEB-INF/log/%yyyy/%mm/%dd/info.log" />
<!-- 重启后追加到旧文件 -->
<param name="Append" value="true" />
<!-- 按天分割文件 -->
<!-- param name="DatePattern" value=".yyyy-MM-dd" /-->
<!-- 配置日志格式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%c %d -- %p -- %m%n" />
</layout>
<!-- 配置过滤器,此文件只输出INFO信息 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="INFO" />
</filter>
</appender>
<!-- 配置程序运行时的日志输出,输出到文件,并且文件按天存放 -->
<appender name="WARN"
class="com.zlz.utils.DatedFileAppender">
<param name="Encoding" value="UTF-8" />
<!-- 事件日志文件存放在log/info目录下 -->
<param name="File" value="${root}/WEB-INF/log/%yyyy/%mm/%dd/warn.log" />
<!-- 重启后追加到旧文件 -->
<param name="Append" value="true" />
<!-- 按天分割文件 -->
<!-- param name="DatePattern" value=".yyyy-MM-dd" /-->
<!-- 配置日志格式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%c %d -- %p -- %m%n" />
</layout>
<!-- 配置过滤器,此文件只输出INFO信息 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="WARN" />
<param name="LevelMax" value="WARN" />
</filter>
</appender>
<!-- 配置出现重量级的异常时的日志输出,输出到文件,并且文件按天存放 -->
<appender name="ERROR"
class="com.zlz.utils.DatedFileAppender">
<param name="Encoding" value="UTF-8" />
<!-- 错误日志文件存放在log/error目录下 -->
<param name="File" value="${root}/WEB-INF/log/%yyyy/%mm/%dd/error.log" />
<!-- 重启后追加到旧文件 -->
<param name="Append" value="true" />
<!-- 按天分割文件 -->
<!-- param name="DatePattern" value=".yyyy-MM-dd" /-->
<!-- 配置日志格式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd hh:mm:ss}:%p %c:%L - %m%n" />
</layout>
<!-- 配置过滤器,此文件只输出错误信息 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="ERROR" />
</filter>
</appender>
<!-- 配置出现灾难性的异常时的日志输出,输出到文件,并且文件按天存放 -->
<appender name="FATAL"
class="com.zlz.utils.DatedFileAppender">
<param name="Encoding" value="UTF-8" />
<!-- 错误日志文件存放在log/fatal目录下 -->
<param name="File" value="${root}/WEB-INF/log/%yyyy/%mm/%dd/fatal.log" />
<!-- 重启后追加到旧文件 -->
<param name="Append" value="true" />
<!-- 按天分割文件 -->
<!-- param name="DatePattern" value=".yyyy-MM-dd" /-->
<!-- 配置日志格式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%c %d -- %p -- %m%n" />
</layout>
<!-- 配置过滤器,此文件只输出灾难信息 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="FATAL" />
<param name="LevelMax" value="FATAL" />
</filter>
</appender>
<!-- 配置程序运行时的日志输出,输出到文件,并且文件按天存放 -->
<appender name="TRACE"
class="com.zlz.utils.DatedFileAppender">
<param name="Encoding" value="UTF-8" />
<!-- 事件日志文件存放在log/info目录下 -->
<param name="File" value="${root}/WEB-INF/log/%yyyy/%mm/%dd/trace.log" />
<!-- 重启后追加到旧文件 -->
<param name="Append" value="true" />
<!-- 按天分割文件 -->
<!-- param name="DatePattern" value=".yyyy-MM-dd" /-->
<!-- 配置日志格式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%c %d [%t] %p -- %m%n" />
</layout>
<!-- 配置过滤器,此文件只输出INFO信息 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="TRACE" />
<param name="LevelMax" value="TRACE" />
</filter>
</appender>
<root><!-- 设置接收所有输出的通道 -->
<level value ="INFO"/>
<!-- 对应上面的appender -->
<appender-ref ref="STDOUT"/>
<appender-ref ref="DEBUG"/>
<appender-ref ref="ERROR"/>
<appender-ref ref="INFO"/>
<appender-ref ref="WARN"/>
<appender-ref ref="FATAL"/>
</root>
</log4j:configuration>
2、在web.xml中配置log4j
<!-- log4j配置 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.xml</param-value>
</context-param>
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>root</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- log4j配置 -->
3、自定义的fileAppender
package com.zlz.utils;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.spi.LoggingEvent;
public class DatedFileAppender extends FileAppender {
private final static Logger logger = Logger.getLogger(DatedFileAppender.class);
private long nextCheck = 0L;
private String originFilename = null;
private String getDatedFilename()
{
String str = this.originFilename;
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
String time14 = format.format(new Date());
str = str.replaceAll("%yyyy", time14.substring(0, 4));
str = str.replaceAll("%yy", time14.substring(0, 4));
str = str.replaceAll("%mm", time14.substring(4, 6));
str = str.replaceAll("%dd", time14.substring(6, 8));
str = str.replaceAll("%hh", time14.substring(8, 10));
String curPath = str;
try
{
newFolder(str);
}
catch (Exception ex) {
logger.error("log4j文件路径创建失败:" + ex);
}
return curPath;
}
void switchFilename() throws IOException {
String datedFilename = getDatedFilename();
if (datedFilename.equals(this.fileName)) {
return;
}
try {
setFile(datedFilename, getAppend(), getBufferedIO(), getBufferSize());
}
catch (IOException ex) {
this.errorHandler.error("setFile(" + datedFilename + ", false) call failed.");
}
this.fileName = datedFilename;
}
public void setFile(String file) {
this.originFilename = file;
super.setFile(getDatedFilename());
}
protected void subAppend(LoggingEvent event) {
long n = System.currentTimeMillis();
if (n >= this.nextCheck) {
this.nextCheck = (n + 30000L);
try {
switchFilename();
}
catch (IOException ioe) {
LogLog.error("switchFilename() failed.", ioe);
}
}
super.subAppend(event);
}
private void newFolder(String folderPath) {
String filePath = folderPath.toString();
java.io.File myFilePath = new java.io.File(filePath);
try {
if (!myFilePath.isDirectory()) {
myFilePath.getParentFile().mkdirs();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
(1). 输出方式appender一般有5种:
org.apache.log4j.RollingFileAppender(滚动文件,自动记录最新日志)
org.apache.log4j.ConsoleAppender (控制台)
org.apache.log4j.FileAppender (文件)
org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)
org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)
(2). 日记记录的优先级priority,优先级由高到低分为
OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG ,ALL。
Log4j建议只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG这五个级别。
(3). 格式说明layout中的参数都以%开始,后面不同的参数代表不同的格式化信息(参数按字母表顺序列出):
%c 输出所属类的全名,可在修改为 %d{Num} ,Num类名输出的维(如:"org.apache.elathen.ClassName",%C{2}将输出elathen.ClassName)
%d 输出日志时间其格式为 %d{yyyy-MM-dd HH:mm:ss,SSS},可指定格式 如 %d{HH:mm:ss}
%l 输出日志事件发生位置,包括类目名、发生线程,在代码中的行数
%n 换行符
%m 输出代码指定信息,如info(“message”),输出message
%p 输出优先级,即 FATAL ,ERROR 等
%r 输出从启动到显示该log信息所耗费的毫秒数
%t 输出产生该日志事件的线程名