在开发web项目时,有时候一些老项目,对于log4j使用不是规范,造成有些log用的是stdout,这样web启动时,一些信息就会被刷掉,查看起来非常不方便,故此,有时候需要把console的信息保存的文件中:
下面就给出一种web项目中的console信息保存到文件的方式:
其实就是修改默认的输出流为文件流,只不过要选择一个合适的时机而已
下面这就是一个合适的时机:
package com.jb.listener;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ConsoleToFileListener implements ServletContextListener {
private ServletContext context = null;
@Override
public void contextInitialized(ServletContextEvent arg0) {
context = arg0.getServletContext();
System.out.println(context.getRealPath("/"));
PrintStream out = null;
MultiOutputStream multi = null;
try {
out = new PrintStream(new File(context.getRealPath("/") + "sysout.log"), "UTF-8");
multi = new MultiOutputStream(out, System.out);
// 设置输出流为多个,既从stdout输出,也保存到文件中
System.setOut(new PrintStream(multi));
//设置输出流为单个
// System.setOut(out);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(multi != null){
multi.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if(out != null){
out.close();
}
}
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
context = null;
}
/**
* leip 2016年12月19日 TODO
**/
}
class MultiOutputStream extends OutputStream {
OutputStream outputStream1, outputStream2;
public MultiOutputStream(OutputStream stream1, OutputStream stream2) throws IOException {
outputStream1 = stream1;
outputStream2 = stream2;
}
@Override
public void write(int b) throws IOException {
// TODO Auto-generated method stub
outputStream1.write(b);
outputStream2.write(b);
}
/**
* leip 2016年12月19日 TODO
**/
}
在web.xml中配置listener即可
<listener>
<listener-class>com.jb.listener.ConsoleToFileListener</listener-class> </listener>