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