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: users@tomcat.apache.org
> >> To unsubscribe, e-mail: [EMAIL PROTECTED]
> >> For additional commands, e-mail: [EMAIL PROTECTED]
> >>
> >>
> >
> > ---------------------------------------------------------------------
> > To start a new topic, e-mail: users@tomcat.apache.org
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
>
>
>
> ---------------------------------------------------------------------
> To start a new topic, e-mail: users@tomcat.apache.org
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>


---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to