Author: markt Date: Wed Jul 7 23:33:28 2010 New Revision: 961535 URL: http://svn.apache.org/viewvc?rev=961535&view=rev Log: Improve logging of unhandled servlet exceptions by including the context name. For JasperExceptions, the JSP snippet will be logged (if enabled). Previously this was not logged and only displayed in the error page seen by the user.
Modified: tomcat/trunk/java/org/apache/catalina/Globals.java tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java tomcat/trunk/java/org/apache/jasper/Constants.java tomcat/trunk/java/org/apache/jasper/compiler/JavacErrorDetail.java tomcat/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/catalina/Globals.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/Globals.java?rev=961535&r1=961534&r2=961535&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/Globals.java (original) +++ tomcat/trunk/java/org/apache/catalina/Globals.java Wed Jul 7 23:33:28 2010 @@ -177,6 +177,12 @@ public final class Globals { /** + * Platform specific new line sequence. + */ + public static final String NEWLINE = System.getProperty("line.separator"); + + + /** * The request attribute under which the request URI of the included * servlet is stored on an included dispatcher request. */ Modified: tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties?rev=961535&r1=961534&r2=961535&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties Wed Jul 7 23:33:28 2010 @@ -226,7 +226,8 @@ standardWrapper.notContext=Parent contai standardWrapper.notFound=Servlet {0} is not available standardWrapper.notServlet=Class {0} is not a Servlet standardWrapper.releaseFilters=Release filters exception for servlet {0} -standardWrapper.serviceException=Servlet.service() for servlet {0} threw exception +standardWrapper.serviceException=Servlet.service() for servlet [{0}] in context with path [{1}] threw exception +standardWrapper.serviceExceptionRoot=Servlet.service() for servlet [{0}] in context with path [{1}] threw exception [{2}] with root cause standardWrapper.statusHeader=HTTP Status {0} - {1} standardWrapper.statusTitle=Tomcat Error Report standardWrapper.unavailable=Marking servlet {0} as unavailable Modified: tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java?rev=961535&r1=961534&r2=961535&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java Wed Jul 7 23:33:28 2010 @@ -253,14 +253,16 @@ final class StandardWrapperValve exception(request, response, e); } catch (IOException e) { request.removeAttribute(Globals.JSP_FILE_ATTR); - container.getLogger().error(sm.getString("standardWrapper.serviceException", - wrapper.getName()), e); + container.getLogger().error(sm.getString( + "standardWrapper.serviceException", wrapper.getName(), + context.getName()), e); throwable = e; exception(request, response, e); } catch (UnavailableException e) { request.removeAttribute(Globals.JSP_FILE_ATTR); - container.getLogger().error(sm.getString("standardWrapper.serviceException", - wrapper.getName()), e); + container.getLogger().error(sm.getString( + "standardWrapper.serviceException", wrapper.getName(), + context.getName()), e); // throwable = e; // exception(request, response, e); wrapper.unavailable(e); @@ -281,15 +283,18 @@ final class StandardWrapperValve request.removeAttribute(Globals.JSP_FILE_ATTR); Throwable rootCause = StandardWrapper.getRootCause(e); if (!(rootCause instanceof ClientAbortException)) { - container.getLogger().error(sm.getString("standardWrapper.serviceException", - wrapper.getName()), rootCause); + container.getLogger().error(sm.getString( + "standardWrapper.serviceExceptionRoot", + wrapper.getName(), context.getName(), e.getMessage()), + rootCause); } throwable = e; exception(request, response, e); } catch (Throwable e) { request.removeAttribute(Globals.JSP_FILE_ATTR); - container.getLogger().error(sm.getString("standardWrapper.serviceException", - wrapper.getName()), e); + container.getLogger().error(sm.getString( + "standardWrapper.serviceException", wrapper.getName(), + context.getName()), e); throwable = e; exception(request, response, e); } @@ -437,29 +442,34 @@ final class StandardWrapperValve exception(request, response, e); } catch (IOException e) { request.removeAttribute(Globals.JSP_FILE_ATTR); - container.getLogger().error(sm.getString("standardWrapper.serviceException", - wrapper.getName()), e); + container.getLogger().error(sm.getString( + "standardWrapper.serviceException", wrapper.getName(), + context.getName()), e); throwable = e; exception(request, response, e); } catch (UnavailableException e) { request.removeAttribute(Globals.JSP_FILE_ATTR); - container.getLogger().error(sm.getString("standardWrapper.serviceException", - wrapper.getName()), e); + container.getLogger().error(sm.getString( + "standardWrapper.serviceException", wrapper.getName(), + context.getName()), e); // Do not save exception in 'throwable', because we // do not want to do exception(request, response, e) processing } catch (ServletException e) { request.removeAttribute(Globals.JSP_FILE_ATTR); Throwable rootCause = StandardWrapper.getRootCause(e); if (!(rootCause instanceof ClientAbortException)) { - container.getLogger().error(sm.getString("standardWrapper.serviceException", - wrapper.getName()), rootCause); + container.getLogger().error(sm.getString( + "standardWrapper.serviceExceptionRoot", + wrapper.getName(), context.getName(), e.getMessage()), + rootCause); } throwable = e; exception(request, response, e); } catch (Throwable e) { request.removeAttribute(Globals.JSP_FILE_ATTR); - container.getLogger().error(sm.getString("standardWrapper.serviceException", - wrapper.getName()), e); + container.getLogger().error(sm.getString( + "standardWrapper.serviceException", wrapper.getName(), + context.getName()), e); throwable = e; exception(request, response, e); } Modified: tomcat/trunk/java/org/apache/jasper/Constants.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/Constants.java?rev=961535&r1=961534&r2=961535&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/jasper/Constants.java (original) +++ tomcat/trunk/java/org/apache/jasper/Constants.java Wed Jul 7 23:33:28 2010 @@ -97,6 +97,11 @@ public class Constants { public static final int MAX_POOL_SIZE = 5; /** + * Platform specific new line sequence. + */ + public static final String NEWLINE = System.getProperty("line.separator"); + + /** * The query parameter that causes the JSP engine to just * pregenerated the servlet but not invoke it. */ Modified: tomcat/trunk/java/org/apache/jasper/compiler/JavacErrorDetail.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/compiler/JavacErrorDetail.java?rev=961535&r1=961534&r2=961535&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/jasper/compiler/JavacErrorDetail.java (original) +++ tomcat/trunk/java/org/apache/jasper/compiler/JavacErrorDetail.java Wed Jul 7 23:33:28 2010 @@ -25,6 +25,7 @@ import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; +import org.apache.jasper.Constants; import org.apache.jasper.JspCompilationContext; /** @@ -129,7 +130,7 @@ public class JavacErrorDetail { fragment.append(i+1); fragment.append(": "); fragment.append(jspLines[i]); - fragment.append("\n"); + fragment.append(Constants.NEWLINE); } jspExtract = fragment.toString(); Modified: tomcat/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java?rev=961535&r1=961534&r2=961535&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java (original) +++ tomcat/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java Wed Jul 7 23:33:28 2010 @@ -30,6 +30,7 @@ import javax.servlet.http.HttpServletReq import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.tagext.TagInfo; +import org.apache.jasper.Constants; import org.apache.jasper.JasperException; import org.apache.jasper.JspCompilationContext; import org.apache.jasper.Options; @@ -509,9 +510,10 @@ public class JspServletWrapper { if (options.getDisplaySourceFragment()) { return new JasperException(Localizer.getMessage ("jsp.exception", detail.getJspFileName(), - "" + jspLineNumber) + - "\n\n" + detail.getJspExtract() + - "\n\nStacktrace:", ex); + "" + jspLineNumber) + Constants.NEWLINE + + Constants.NEWLINE + detail.getJspExtract() + + Constants.NEWLINE + Constants.NEWLINE + + "Stacktrace:", ex); } Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=961535&r1=961534&r2=961535&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Wed Jul 7 23:33:28 2010 @@ -112,6 +112,10 @@ <bug>49551</bug>: Allow default context.xml location to be specified using an absolute path. (markt) </fix> + <add> + Improve logging of unhandled exceptions in servlets by including the + path of the context where the error occurred. (markt) + </add> </changelog> </subsection> <subsection name="Jasper"> @@ -131,6 +135,10 @@ <bug>49217</bug>: Ensure that identifiers used in EL meet the requirements of the Java Language Specification. (markt) </fix> + <add> + Improve logging of JSP exceptions by including JSP snippet (if enabled) + rather than just the root cause in the host log. (markt) + </add> </changelog> </subsection> <subsection name="Cluster"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org