当前访客身份:游客 [ 登录 | 加入 OSCHINA ]

代码分享

当前位置:
代码分享 » Java  » Web编程
分享到: 
收藏 +0
2
当网站发生异常了怎么办呢?难道我们需要一直去翻阅Tomcat的日志文件吗?
本代码是oschina用来将所有的500错误的信息发送给指定的邮箱
标签: OSCHINA Email

代码片段(4) [全屏查看所有代码]

1. [代码]500.vm     跳至 [1] [2] [3] [4] [全屏预览]

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>应用程序出错</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <link rel="stylesheet" href="$link.css("osc-error.css")" type="text/css" media="screen" />
</head>
<body>
#set($__nothing = $osc_tool.report_error($request))
  <div id='msg-box'>
	<div class='logo'><a href="$link.root()"><img src="$link.img('logo.gif')" border="0" alt=""></a></div>
    <div class='title'>您访问的页面发生错误!</div>
    <div class='msg'>我们已经将此错误信息记录下来,并将尽快处理,为此造成您的不便请多见谅</div>		
    <div class='nav'><a href="$link.root()">&gt; 返回首页 &lt;</a></div>
  </div>
</body>
</html>

2. [代码]web.xml     跳至 [1] [2] [3] [4] [全屏预览]

<error-page>
	<error-code>500</error-code>
	<location>/500.vm</location>
</error-page>

3. [代码][Java]代码     跳至 [1] [2] [3] [4] [全屏预览]

/**
 * 报告错误信息
 * 在vm上的用法 $osc_tool.report_error($request)
 * @param t
 */
public static void report_error(HttpServletRequest req){
	SmtpHelper.reportError(req, null);
}

4. [代码]SmtpHelper.java     跳至 [1] [2] [3] [4] [全屏预览]

/**
 * 报告错误信息
 * @param req
 * @param excp
 */
public static void reportError(HttpServletRequest req, Throwable excp){
	boolean is_localhost = (req!=null)?"127.0.0.1".equals(RequestUtils.getRemoteAddr(req)):false;
	Throwable t = excp;
	if(t == null) t = _GetException(req);
	if(t == null) return ;

	log.error("System Exception", t);
	if(!is_localhost)
	//发送电子邮件通知
	try {
		String email = smtp_props.getProperty("administrator");
		String title = ResourceUtils.getString("ui", "error_500", t.getClass().getSimpleName());
		String content = getErrorHtml(req, t);
		//发送邮件到指定邮箱
		_SendHtmlMail(Arrays.asList(StringUtils.split(email,",")), title, content);
	} catch (Exception e) {
		log.error("Failed to send error report.", e);
	}
}

/**
 * 格式化错误信息
 * @param req
 * @param t 错误信息
 * @param site 出错的个人空间
 * @return
 * <h2>Request Headers</h2>
 */
@SuppressWarnings("rawtypes")
public static String getErrorHtml(HttpServletRequest req, Throwable t) {
	StringBuilder html = new StringBuilder(error_css);
	if(req != null){
		html.append("<h2>Request Headers</h2><table>");	
		html.append("<tr><th>Request URL</th><td>");
		html.append(req.getRequestURL().toString());
		if(req.getQueryString()!=null){
			html.append('?');
			html.append(req.getQueryString());						
		}
		html.append("</td></tr>");
		html.append("<tr><th>Remote Addr</th><td>");
		html.append(RequestUtils.getRemoteAddr(req));
		html.append("</td></tr>");
		html.append("<tr><th>Request Method</th><td>");
		html.append(req.getMethod());
		html.append("</td></tr>");
		html.append("<tr><th>CharacterEncoding</th><td>");
		html.append(req.getCharacterEncoding());
		html.append("</td></tr>");
		html.append("<tr><th>Request Locale</th><td>");
		html.append(req.getLocale());
		html.append("</td></tr>");
		html.append("<tr><th>Content Type</th><td>");
		html.append(req.getContentType());
		html.append("</td></tr>");
		Enumeration headers = req.getHeaderNames();
		while(headers.hasMoreElements()){
			String key = (String)headers.nextElement();
			html.append("<tr><th>");
			html.append(key);
			html.append("</th><td>");
			html.append(req.getHeader(key));
			html.append("</td></tr>");
		}		
		html.append("</table><h2>Request Parameters</h2><table>");		
		Enumeration params = req.getParameterNames();
		while(params.hasMoreElements()){
			String key = (String)params.nextElement();
			html.append("<tr><th>");
			html.append(key);
			html.append("</th><td>");
			html.append(req.getParameter(key));
			html.append("</td></tr>");
		}
		html.append("</table>");
	}
	html.append("<h2>");
	html.append(t.getClass().getName());
	html.append('(');
	html.append(DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss"));
	html.append(")</h2><pre>");
	try {
		html.append(_Exception(t));
	} catch (IOException ex) {}
	html.append("</pre>");

	html.append("<h2>System Properties</h2><table>");		
	Set props = System.getProperties().keySet();
	for(Object prop : props){
		html.append("<tr><th>");
		html.append(prop);
		html.append("</th><td>");
		html.append(System.getProperty((String)prop));
		html.append("</td></tr>");
	}
	html.append("</table>");
	return html.toString();
}

/**
 * 将当前上下文发生的异常转为字符串
 * @return
 * @throws IOException
 */
private static Throwable _GetException(HttpServletRequest req) {
	if(req == null) return null;
	Throwable t = (Throwable)req.getAttribute("javax.servlet.jsp.jspException");
	if(t==null){
		//Tomcat的错误处理方式
		t = (Throwable)req.getAttribute("javax.servlet.error.exception");
	}
	return t;
}

/**
 * 将异常信息转化成字符串
 * @param t
 * @return
 * @throws IOException 
 */
private static String _Exception(Throwable t) throws IOException{
	if(t == null)
		return null;
	ByteArrayOutputStream baos = new ByteArrayOutputStream();
	try{
		t.printStackTrace(new PrintStream(baos));
	}finally{
		baos.close();
	}
	return baos.toString();
}


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(26)

  • 1楼:徐小路 发表于 2010-11-25 09:09 回复此评论
    收藏,,,,,,,,,,,,,,,,,
  • 2楼:小杨阿哥哥 发表于 2010-11-25 09:16 回复此评论
    好东西。
  • 3楼:李永波 发表于 2010-11-25 11:47 回复此评论
    不错 
  • 4楼:北柯一梦 发表于 2010-11-25 12:29 回复此评论
    够开源的,呵呵
  • 5楼:programtic 发表于 2010-11-25 13:42 回复此评论
    谢谢红薯老大分享,我们网站就弄了个404页面,借鉴您的处理方式了。
  • 6楼:红薯 发表于 2010-11-25 13:47 回复此评论

    引用来自“张优”的评论

    谢谢红薯老大分享,我们网站就弄了个404页面,借鉴您的处理方式了。
    404不太适合吧,容易被搞啊,例如我疯狂请求你一个不存在的页面,那你的邮件系统就很麻烦了。而500错误可不是谁都可以搞出来的,除非程序出错:)
  • 7楼:programtic 发表于 2010-11-25 13:54 回复此评论
    呵呵,不好意思,我没表达清楚,我的意思是加个500的页面,然后参照您的方式发邮件。
  • 8楼:罪恶的花生 发表于 2010-11-25 14:57 回复此评论

    引用来自“红薯”的评论

    引用来自“张优”的评论

    谢谢红薯老大分享,我们网站就弄了个404页面,借鉴您的处理方式了。
    404不太适合吧,容易被搞啊,例如我疯狂请求你一个不存在的页面,那你的邮件系统就很麻烦了。而500错误可不是谁都可以搞出来的,除非程序出错:)
    呵呵!
  • 9楼:yuzhouliu 发表于 2010-11-29 08:57 回复此评论
    $link.css("osc-error.css")
    #set($__nothing = $osc_tool.report_error($request))
    这是哪里的语法?jsp, js ?
  • 10楼:红薯 发表于 2010-11-29 08:58 回复此评论

    引用来自“yuzhouliu”的评论

    $link.css("osc-error.css")
    #set($__nothing = $osc_tool.report_error($request))
    这是哪里的语法?jsp, js ?
    velocity 的,这些都是velocity的toolbox方法(自己写的)
  • 11楼:newleague 发表于 2010-12-08 19:51 回复此评论
    收藏了。。。。
  • 12楼:北落 发表于 2010-12-22 15:03 回复此评论
    我也做个去 哈哈 学习了

  • 13楼:王昊 发表于 2010-12-31 10:45 回复此评论
    req.getAttribute("javax.servlet.error.exception");

    这是怎么取出来的??在程序报错的时候将错误保存到req中了??
  • 14楼:frankiegao123 发表于 2011-02-25 23:21 回复此评论
    既然用了 Velocity,那后面拼 HTML 邮件内容的那个,是不是可以用数据与 .vm 文件合并呢?这样我感觉维护性要好很多,否则那个 append 拼表格实在太晕了呀
  • 15楼:FoxHu 发表于 2012-03-14 19:07 回复此评论
    @红薯 :其中 _SendHtmlMail(Arrays.asList(StringUtils.split(email,"," )), title, content); 这个_SendHtmlMail方法具体是怎么实现的?谢谢!
  • 16楼:红薯 发表于 2012-03-14 19:51 回复此评论

    引用来自“hil2010”的评论

    @红薯 :其中 _SendHtmlMail(Arrays.asList(StringUtils.split(email,"," )), title, content); 这个_SendHtmlMail方法具体是怎么实现的?谢谢!
    你可以用 #commons email# 这个项目来实现
  • 17楼:囧南风囧 发表于 2012-03-14 20:25 回复此评论
    学习了,谢谢!
  • 18楼:FoxHu 发表于 2012-03-14 22:29 回复此评论

    引用来自“红薯”的评论

    引用来自“hil2010”的评论

    @红薯 :其中 _SendHtmlMail(Arrays.asList(StringUtils.split(email,"," )), title, content); 这个_SendHtmlMail方法具体是怎么实现的?谢谢!
    你可以用 #commons email# 这个项目来实现
    谢谢!
  • 19楼:无名人士 发表于 2012-03-27 19:10 回复此评论

    有人把这份代码卖到文库里去了,手法极其不专业和不负责任,开源是好事,可是给别人的东西连页码都不去一下:
    http://wenku.baidu.com/view/4c610edba58da0116c17494a.html

  • 20楼:主编 发表于 2012-11-16 11:59 回复此评论
    谁来弄个php版本的。
开源从代码分享开始 分享代码