如果没有Seam,则可以使用错误处理程序servlet:
web.xml
:
<servlet>
<servlet-name>ErrorHandlerServlet</servlet-name>
<servlet-class>com.example.ErrorHandlerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ErrorHandlerServlet</servlet-name>
<url-pattern>/ErrorHandlerServlet</url-pattern>
</servlet-mapping>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/ErrorHandlerServlet</location>
</error-page>
'ErrorHandlerServlet.java':
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ErrorHandlerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory
.getLogger(ErrorHandlerServlet.class);
@Override
protected void doGet(final HttpServletRequest request,
final HttpServletResponse response)
throws ServletException, IOException {
logger.info("handler");
final Object errorMessage = request
.getAttribute(RequestDispatcher.ERROR_MESSAGE);
final Object throwableObj = request
.getAttribute(RequestDispatcher.ERROR_EXCEPTION);
logger.warn("error message: {}", errorMessage, throwableObj);
final Logger appLogger = LoggerFactory
.getLogger("com.example");
if (!appLogger.isInfoEnabled()) {
final RequestDispatcher requestDispatcher =
request.getRequestDispatcher("/error.html");
requestDispatcher.forward(request, response);
return;
}
final PrintWriter writer = response.getWriter();
writer.println("<pre>");
if (throwableObj != null && throwableObj instanceof Throwable) {
final Throwable throwable = (Throwable) throwableObj;
throwable.printStackTrace(writer);
}
writer.println("</pre>");
}
}
无论如何,我认为这不是一个好的实践,很少有人期望更改日志配置会影响应用程序的行为。在生产环境中产生这种副作用可能是有问题的。一个
show-stacktraces
web.xml文件
上下文参数可能是更好的方法。