在websphere服务器配置日志的时候有一项内容,可以吧程序里的打印语句内容输出到日志文件中,即web项目中的java类或者jsp页面中的system.out.print(“XX”)的内容
写到指定的日志文件里,而不是输出到控制台。
如果不用应用服务器的配置,在web项目中如何实现这个功能的呢?
重置输出流的语句如下,
PrintStream out = new PrintStream(new File(context.getRealPath("/")+"sysout.log"),"UTF-8");
System.setOut(out);
这个语句放什么地方合适呢?
一开始想到了过滤器,在web.xml中配置所有请求都走这个过滤器,可是问题出来了,每个请求执行一次该过滤器操作便会将日志文件重置,即日志文件只能记录最后一次请求中的打印内容,不能实现想要的功能。
那怎么办呢,于是想到了监听器,可以在web服务启动时重置输出流 ,这样就能实现想要的功能了。
首先创建监听器,在监听器内重置输出流,代码如下:
package test.servlet;
import java.io.*;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyContextListener implements ServletContextListener {
private ServletContext context = null;
@Override
public void contextInitialized(ServletContextEvent sce)
{
context = sce.getServletContext();
System.out.println(context.getRealPath("/"));
PrintStream out;
try
{
out = new PrintStream(new File(context.getRealPath("/")+"sysout.log"),"UTF-8");
System.setOut(out);
}
catch (Exception e)
{
e.printStackTrace();
}
}
@Override
public void contextDestroyed(ServletContextEvent sce)
{
}
}
然后在web.xml配置监听器,如下:
<listener>
<listener-class>test.servlet.MyContextListener</listener-class>
</listener>
这样启动web项目之后,所有的打印语句system.out.print(“XX”)的输出结果都会记录在指定的文本文件中了。
至于websphere服务器是怎么实现的,还没有搞明白,肯定不会这么简单,这样做仅仅对单个web项目有用,而websphere服务器的日志配置是对本台服务器上的所有web项目都会起作用,实现起来应该比较复杂的。