原文地址:http://ketayao.com/view/33
web开发,有个场景,希望将错误日志发送到指定邮箱,这样可以做到远程监控,实时处理。下面写一个利用apache commons email的例子,发送错误日志的例子。
003 | * @author <a href="mailto:ketayao@gmail.com">ketayao</a> |
004 | * @since 2013年9月7日 下午6:27:05 |
007 | public class EmailExceptionHandler extends ExceptionHandler { |
009 | private static final Logger log = LoggerFactory.getLogger(EmailExceptionHandler. class ); |
016 | public static void reportError(HttpServletRequest req, Throwable excp){ |
017 | boolean is_localhost = (req!= null )? "127.0.0.1" .equals(RequestUtils.getRemoteAddr(req)): false ; |
019 | if (t == null ) t = _getException(req); |
020 | if (t == null ) return ; |
022 | log.error( "System Exception" , t); |
026 | String email = SystemConfig.getConfig().get( "blog.exception.email.to" ); |
027 | String title = "错误" + t.getClass().getSimpleName(); |
028 | String content = getErrorHtml(req, t); |
030 | _sendHtmlMail(Arrays.asList(StringUtils.split(email, "," )), title, content); |
031 | } catch (Exception e) { |
032 | log.error( "Failed to send error report." , e); |
043 | private static void _sendHtmlMail(List<String> emailAddress, String title, |
044 | String content) throws Exception { |
045 | for (String address : emailAddress) { |
046 | HtmlEmail email = new HtmlEmail(); |
047 | email.setStartTLSEnabled( true ); |
048 | email.setHostName(SystemConfig.getConfig().get( "blog.exception.email.hotname" )); |
049 | email.setAuthentication(SystemConfig.getConfig().get( "blog.exception.email.name" ), |
050 | SystemConfig.getConfig().get( "blog.exception.email.password" )); |
051 | email.setFrom(SystemConfig.getConfig().get( "blog.exception.email.name" )); |
053 | email.addTo(address); |
055 | email.setSubject(title); |
057 | email.setHtmlMsg(content); |
059 | email.setTextMsg( "Your email client does not support HTML messages" ); |
069 | * @param site 出错的个人空间 |
071 | * <h2>Request Headers</h2> |
073 | @SuppressWarnings ( "rawtypes" ) |
074 | public static String getErrorHtml(HttpServletRequest req, Throwable t) { |
075 | StringBuilder html = new StringBuilder(); |
077 | html.append( "<h2>Request Headers</h2><table>" ); |
078 | html.append( "<tr><th>Request URL</th><td>" ); |
079 | html.append(req.getRequestURL().toString()); |
080 | if (req.getQueryString()!= null ){ |
082 | html.append(req.getQueryString()); |
084 | html.append( "</td></tr>" ); |
085 | html.append( "<tr><th>Remote Addr</th><td>" ); |
086 | html.append(RequestUtils.getRemoteAddr(req)); |
087 | html.append( "</td></tr>" ); |
088 | html.append( "<tr><th>Request Method</th><td>" ); |
089 | html.append(req.getMethod()); |
090 | html.append( "</td></tr>" ); |
091 | html.append( "<tr><th>CharacterEncoding</th><td>" ); |
092 | html.append(req.getCharacterEncoding()); |
093 | html.append( "</td></tr>" ); |
094 | html.append( "<tr><th>Request Locale</th><td>" ); |
095 | html.append(req.getLocale()); |
096 | html.append( "</td></tr>" ); |
097 | html.append( "<tr><th>Content Type</th><td>" ); |
098 | html.append(req.getContentType()); |
099 | html.append( "</td></tr>" ); |
100 | Enumeration headers = req.getHeaderNames(); |
101 | while (headers.hasMoreElements()){ |
102 | String key = (String)headers.nextElement(); |
103 | html.append( "<tr><th>" ); |
105 | html.append( "</th><td>" ); |
106 | html.append(req.getHeader(key)); |
107 | html.append( "</td></tr>" ); |
109 | html.append( "</table><h2>Request Parameters</h2><table>" ); |
110 | Enumeration params = req.getParameterNames(); |
111 | while (params.hasMoreElements()){ |
112 | String key = (String)params.nextElement(); |
113 | html.append( "<tr><th>" ); |
115 | html.append( "</th><td>" ); |
116 | html.append(req.getParameter(key)); |
117 | html.append( "</td></tr>" ); |
119 | html.append( "</table>" ); |
122 | html.append(t.getClass().getName()); |
124 | html.append(DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss" )); |
125 | html.append( ")</h2><pre>" ); |
127 | html.append(_exception(t)); |
128 | } catch (IOException ex) {} |
129 | html.append( "</pre>" ); |
131 | html.append( "<h2>System Properties</h2><table>" ); |
132 | Set props = System.getProperties().keySet(); |
133 | for (Object prop : props){ |
134 | html.append( "<tr><th>" ); |
136 | html.append( "</th><td>" ); |
137 | html.append(System.getProperty((String)prop)); |
138 | html.append( "</td></tr>" ); |
140 | html.append( "</table>" ); |
141 | return html.toString(); |
147 | * @throws IOException |
149 | private static Throwable _getException(HttpServletRequest req) { |
150 | if (req == null ) return null ; |
151 | Throwable t = (Throwable)req.getAttribute( "javax.servlet.jsp.jspException" ); |
154 | t = (Throwable)req.getAttribute( "javax.servlet.error.exception" ); |
163 | * @throws IOException |
165 | private static String _exception(Throwable t) throws IOException{ |
168 | ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
170 | t.printStackTrace( new PrintStream(baos)); |
174 | return baos.toString(); |
181 | * @see com.ketayao.fensy.handler.Handler#handle(com.ketayao.fensy.mvc.RequestContext, java.lang.Exception) |
184 | public String handle( final RequestContext rc, final Exception exception) { |
185 | String view = super .handle(rc, exception); |
187 | Thread thread = new Thread( new Runnable() { |
191 | reportError(rc.request(), exception); |