Heres what I have put together, use at your own risk. any comments welcome.
HttpServletResponseLoggingFilter.java
public class HttpServletResponseLoggingFilter implements Filter
{
private Logger mLogger =
Logger.getLogger(HttpServletResponseLoggingFilter.class);
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain) throws
IOException, ServletException
{
if ( mLogger.isDebugEnabled() && servletResponse instanceof
HttpServletResponse &&
isNonStaticResource((HttpServletRequest)servletRequest) )
{
final LoggingHttpServletResponse
loggingHttpServletResponse = new
LoggingHttpServletResponse((HttpServletResponse)servletResponse);
try
{
mLogger.debug("Filtering request : " +
getFullRequestUrl((HttpServletRequest)servletRequest));
filterChain.doFilter(servletRequest,
loggingHttpServletResponse);
}
finally
{
loggingHttpServletResponse.finishResponse();
}
}
else
{
filterChain.doFilter(servletRequest, servletResponse);
}
}
private boolean isNonStaticResource(HttpServletRequest request)
{
return !request.getRequestURI().contains("resources");
}
// http://hostname.com/mywebapp/servlet/MyServlet/a/b;c=123?d=789
private String getFullRequestUrl(HttpServletRequest request)
{
String reqUrl = request.getRequestURL().toString();
String queryString = request.getQueryString(); // d=789
if (queryString != null)
{
reqUrl += "?"+queryString;
}
return reqUrl;
}
public void init(FilterConfig filterConfig) throws ServletException
{
}
public void destroy()
{
}
}
LoggingHttpServletResponse.java
class LoggingHttpServletResponse extends HttpServletResponseWrapper
{
private Logger mLogger = Logger.getLogger(LoggingHttpServletResponse.class);
public LoggingHttpServletResponse(HttpServletResponse httpServletResponse)
{
super(httpServletResponse);
mWrappedResponse = httpServletResponse;
}
// ----------------------------------------------------- Instance Variables
/**
* Original response
*/
protected HttpServletResponse mWrappedResponse = null;
/**
* The ServletOutputStream that has been returned by
* <code>getOutputStream()</code>, if any.
*/
protected ServletOutputStream mStream = null;
/**
* The PrintWriter that has been returned by
* <code>getWriter()</code>, if any.
*/
protected PrintWriter mWriter = null;
// --------------------------------------------------------- Public Methods
/**
* Create and return a ServletOutputStream to write the content
* associated with this Response.
*
* @throws IOException if an input/output error occurs
*/
public ServletOutputStream createOutputStream() throws IOException
{
mLogger.debug("Creating new LoggingOutputStream");
return new LoggingServletOutputStream(mWrappedResponse, mLogger);
}
/**
* Finish a response.
*/
public void finishResponse()
{
try
{
if (mWriter != null)
{
mWriter.close();
}
else
{
if (mStream != null)
mStream.close();
}
}
catch (IOException e)
{
}
}
// ------------------------------------------------ ServletResponse Methods
/**
* Flush the buffer and commit this response.
*
* @throws IOException if an input/output error occurs
*/
public void flushBuffer() throws IOException
{
mStream.flush();
}
/**
* Return the servlet output mStream associated with this Response.
*
* @throws IllegalStateException if <code>getWriter</code> has
* already been called for this response
* @throws IOException if an input/output error occurs
*/
public ServletOutputStream getOutputStream() throws IOException
{
if (mWriter != null)
throw new IllegalStateException("getWriter() has already
been called for this response");
if (mStream == null)
mStream = createOutputStream();
mLogger.debug("mStream is set to " + mStream + " in getOutputStream");
return (mStream);
}
/**
* Return the mWriter associated with this Response.
*
* @throws IllegalStateException if <code>getOutputStream</code> has
* already been called for this response
* @throws IOException if an input/output error occurs
*/
public PrintWriter getWriter() throws IOException
{
if (mWriter != null)
return (mWriter);
if (mStream != null)
throw new IllegalStateException("getOutputStream() has
already been called for this response");
mStream = createOutputStream();
mLogger.debug("mStream is set to " + mStream + " in getOutputStream");
// HttpServletResponse.getCharacterEncoding() shouldn't return null
// according the spec, so feel free to remove that "if"
mWriter = new PrintWriter(mStream);
return (mWriter);
}
}
LoggingServletOutputStream.java
class LoggingServletOutputStream extends ServletOutputStream
{
private Logger mLogger;
private HttpServletResponse mResponse;
private OutputStream mOutputStream;
private ByteArrayOutputStream mByteArrayOutputStream = new
ByteArrayOutputStream();
public LoggingServletOutputStream(HttpServletResponse response,
Logger logger) throws IOException
{
mResponse = response;
mOutputStream = mResponse.getOutputStream();
mLogger = logger;
}
public void write(int b) throws IOException
{
mByteArrayOutputStream.write(b);
mOutputStream.write(b);
}
@Override
public void write(byte b[]) throws IOException
{
mByteArrayOutputStream.write(b);
mOutputStream.write(b);
}
@Override
public void write(byte b[], int off, int len) throws IOException
{
mByteArrayOutputStream.write(b, off, len);
mOutputStream.write(b, off, len);
}
@Override
public void close() throws IOException
{
if ( mLogger.isDebugEnabled() )
{
float kBytes = mByteArrayOutputStream.size() / 1024f;
mLogger.debug("Writing " + kBytes + " kb (" +
mByteArrayOutputStream.size() +" b) to the client.\n" +
mByteArrayOutputStream.toString());
}
mByteArrayOutputStream = null;
mOutputStream.close();
}
@Override
public void flush() throws IOException
{
mOutputStream.flush();
}
}
web.xml Snippit..
<filter>
<filter-name>Logging Filter</filter-name>
<filter-class>com.nexusalpha.journeycheck.presentation.debug.HttpServletResponseLoggingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Logging Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
On 7/24/07, ben short <[EMAIL PROTECTED]> wrote:
Yes sure.
On 7/24/07, Karel V Sedlacek <[EMAIL PROTECTED]> wrote:
> Ben,
>
> When you succeed at this would you pass along your code? We have issues
> with timeouts and it would be great to see what's being passed along to
> the client.
>
> Karel
> Cornell University
>
> > Yes from the CompressionServletResponseWrapper example I can see the
> > methods I need to override as you have pointed out.
> >
> > On 7/24/07, Tim Funk <[EMAIL PROTECTED]> wrote:
> >> Yes - but tomcat doesn't have that functionality out of the box - you'd
> >> need to write a filter which creates a HttpServletRequestWrapper which
> >> overrides getOutputStream() (or getWriter()) and then passes back a
> >> wrapped OutStream or Writer which also logs to wherever when print(int
> >> i) is called.
> >>
> >> -Tim
> >>
> >> ben short wrote:
> >> > Hi Tim,
> >> >
> >> > Thanks for that, but it only seems to log out the request/response
> >> > headers. Is It possible to log everything sent to the client?
> >> >
> >> > Ben
> >> >
> >> > On 7/24/07, Tim Funk <[EMAIL PROTECTED]> wrote:
> >> >> Look at the RequestDumperValve
> >> >>
> >> >> -Tim
> >> >>
> >> >> ben short wrote:
> >> >> > Hi,
> >> >> >
> >> >> > I using Tomcat 6.0.13 and Spring 2.0.6. I have been involved in
> >> >> > developing a website that products pages in various formats , such
> >> as
> >> >> > www, xml, wap and pda. We are having some issues with wap and pda,
> >> but
> >> >> > cant ciew the html source thats being shown on the devices.
> >> >> > We can view the html source in firefox using a wap and pda plugin,
> >> but
> >> >> > the issues are not always the same or there at all.
> >> >> >
> >> >> > What I would like to do is log all the data sent to the client. I
> >> have
> >> >> > been looking at encapsulating the HttpServletRequest and log out
> >> the
> >> >> > data to a log file.
> >>
> >> ---------------------------------------------------------------------
> >> To start a new topic, e-mail: [email protected]
> >> To unsubscribe, e-mail: [EMAIL PROTECTED]
> >> For additional commands, e-mail: [EMAIL PROTECTED]
> >>
> >>
> >
> > ---------------------------------------------------------------------
> > To start a new topic, e-mail: [email protected]
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
>
>
>
> ---------------------------------------------------------------------
> To start a new topic, e-mail: [email protected]
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
---------------------------------------------------------------------
To start a new topic, e-mail: [email protected]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]