This was an interesting problem. The main thing is to write your own appender . I was looking for the inline code org.apache.log4j.ConsoleAppender for inspiration. I checked this in my tomcat and confirmed that it works. I used log4j-1.2.17 (hopefully it doesn't matter)
1) First, implement your own appender. This appender will write all log events to the current stream output.
package com.tstwbprj.log; import org.apache.log4j.Layout; import org.apache.log4j.WriterAppender; import java.io.IOException; import java.io.OutputStream; public class HttpLogAppender extends WriterAppender { static ThreadLocal<OutputStream> streamPerHttpThread = new ThreadLocal<OutputStream>(); public HttpLogAppender() { } public HttpLogAppender(Layout layout) { setLayout(layout);
2) Add this appender to the log4j configuration file in the same way as other settings
log4j.rootLogger = DEBUG, CA, FA, HA
..
log4j.appender.HA = com.tstwbprj.log.HttpLogAppender log4j.appender.HA.layout = org.apache.log4j.PatternLayout log4j.appender.HA.layout.ConversionPattern =% - 4r [% t]% -5p% c % x -% m% n
3) Add a small piece of code to your servlet so that this appender works correctly. Here is my servlet.
import org.apache.log4j.Category; import org.apache.log4j.Logger; import javax.servlet.ServletOutputStream; import java.io.IOException; public class LogServlet extends javax.servlet.http.HttpServlet { private static final Logger LOG = Logger.getLogger(LogServlet.class); protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { } protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { ServletOutputStream outstream = response.getOutputStream(); configureLogForCurrentRequest(outstream); LOG.info("Got request");
Caution This has not been tested thoroughly, especially with multiple servlet requests, etc. Also do not know why you want to do this. This is not typical for protocol log messages in a browser. Be careful .. :) -
Zenil source share