方法一:
在工程src目录下建立一个log4j.properties文件,该文件会自动拷贝到/WEB-INF/classes下,文件内容如下:
### set log levels ###
log4j.rootLogger = debug, stdout, D, E
### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c:%L - %m%n
### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ${WORKDIR}/logs/log.log
log4j.appender.D.Append = true
## 输出DEBUG级别以上的日志
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n
### 保存异常信息到单独文件 ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
## 异常日志文件名
log4j.appender.E.File = ${WORKDIR}/logs/error.log
log4j.appender.E.Append = true
## 只输出ERROR级别以上的日志!!!
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n
log4j.rootLogger = debug, stdout, D, E
### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c:%L - %m%n
### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ${WORKDIR}/logs/log.log
log4j.appender.D.Append = true
## 输出DEBUG级别以上的日志
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n
### 保存异常信息到单独文件 ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
## 异常日志文件名
log4j.appender.E.File = ${WORKDIR}/logs/error.log
log4j.appender.E.Append = true
## 只输出ERROR级别以上的日志!!!
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n
然后写一个初始化启动的Servlet,代码如下:
package servlets;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
public class Log4jInit extends HttpServlet {
private static final long serialVersionUID = -5543643811008717484L;
public Log4jInit() {
super();
}
public void destroy() {
super.destroy();
}
public void init() throws ServletException {
// 获得工作目录,修改log4j文件的保存路径
String path = this.getServletContext().getRealPath("");
System.out.println(path);
System.setProperty("WORKDIR", path);
super.init();
}
}
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
public class Log4jInit extends HttpServlet {
private static final long serialVersionUID = -5543643811008717484L;
public Log4jInit() {
super();
}
public void destroy() {
super.destroy();
}
public void init() throws ServletException {
// 获得工作目录,修改log4j文件的保存路径
String path = this.getServletContext().getRealPath("");
System.out.println(path);
System.setProperty("WORKDIR", path);
super.init();
}
}
web.xml配置如下:
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>Log4jInit</servlet-name>
<servlet-class>servlets.Log4jInit</servlet-class>
<init-param>
<param-name>log4j</param-name>
<param-value>WEB-INF/classes/log4j.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>Log4jInit</servlet-name>
<servlet-class>servlets.Log4jInit</servlet-class>
<init-param>
<param-name>log4j</param-name>
<param-value>WEB-INF/classes/log4j.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
这样就可以在代码中直接使用了
<%@ page import="org.apache.log4j.Logger;"%>
<%
Logger log = Logger.getLogger(this.getClass());
log.info("记录信息");
log.debug( " debug " );
log.error( " error " );
%>
方法二:
去掉方法一中配置文件log4j.properties中的${WORKDIR}/
然后修改Log4jInit的init方法如下:
public void init() throws ServletException {
String prefix = getServletContext().getRealPath("/");
String file = getInitParameter("log4j");
String filePath = prefix + file;
Properties props = new Properties();
try {
FileInputStream istream = new FileInputStream(filePath);
props.load(istream);
istream.close();
toPrint(props.getProperty("log4j.appender.file.File"));
//设置路径
String logFile = prefix + props.getProperty("log4j.appender.D.File");
props.setProperty("log4j.appender.D.File",logFile);
//设置路径
logFile = prefix + props.getProperty("log4j.appender.E.File");
props.setProperty("log4j.appender.E.File",logFile);
// 装入log4j配置信息
PropertyConfigurator.configure(props);
} catch (IOException e) {
toPrint("Could not read configuration file [" + filePath + "].");
toPrint("Ignoring configuration file [" + filePath + "].");
return;
}
super.init();
}
public static void toPrint(String content) {
System.out.println(content);
}
String prefix = getServletContext().getRealPath("/");
String file = getInitParameter("log4j");
String filePath = prefix + file;
Properties props = new Properties();
try {
FileInputStream istream = new FileInputStream(filePath);
props.load(istream);
istream.close();
toPrint(props.getProperty("log4j.appender.file.File"));
//设置路径
String logFile = prefix + props.getProperty("log4j.appender.D.File");
props.setProperty("log4j.appender.D.File",logFile);
//设置路径
logFile = prefix + props.getProperty("log4j.appender.E.File");
props.setProperty("log4j.appender.E.File",logFile);
// 装入log4j配置信息
PropertyConfigurator.configure(props);
} catch (IOException e) {
toPrint("Could not read configuration file [" + filePath + "].");
toPrint("Ignoring configuration file [" + filePath + "].");
return;
}
super.init();
}
public static void toPrint(String content) {
System.out.println(content);
}