使用Spring进行统一日志管理 + 统一异常管理
http://blog.csdn.net/king87130/article/details/8011843原文地址
统一日志异常实现类:
1 package com.pilelot.web.util; 2 3 import org.apache.log4j.Logger; 4 import org.springframework.aop.ThrowsAdvice; 5 import org.springframework.dao.DataAccessException; 6 7 import java.io.IOException; 8 import java.lang.reflect.Method; 9 import java.sql.SQLException; 10 11 /** 12 * 由Spring AOP调用 输出异常信息,把程序异常抛向业务异常 13 * 14 * @author Andy Chan 15 * 16 */ 17 public class ExceptionAdvisor implements ThrowsAdvice 18 { 19 public void afterThrowing(Method method, Object[] args, Object target, 20 Exception ex) throws Throwable 21 { 22 // 在后台中输出错误异常异常信息,通过log4j输出。 23 Logger log = Logger.getLogger(target.getClass()); 24 log.info("**************************************************************"); 25 log.info("Error happened in class: " + target.getClass().getName()); 26 log.info("Error happened in method: " + method.getName()); 27 for (int i = 0; i < args.length; i++) 28 { 29 log.info("arg[" + i + "]: " + args[i]); 30 } 31 log.info("Exception class: " + ex.getClass().getName()); 32 log.info("ex.getMessage():" + ex.getMessage()); 33 ex.printStackTrace(); 34 log.info("**************************************************************"); 35 36 // 在这里判断异常,根据不同的异常返回错误。 37 if (ex.getClass().equals(DataAccessException.class)) 38 { 39 ex.printStackTrace(); 40 throw new BusinessException("数据库操作失败!"); 41 } else if (ex.getClass().toString().equals( 42 NullPointerException.class.toString())) 43 { 44 ex.printStackTrace(); 45 throw new BusinessException("调用了未经初始化的对象或者是不存在的对象!"); 46 } else if (ex.getClass().equals(IOException.class)) 47 { 48 ex.printStackTrace(); 49 throw new BusinessException("IO异常!"); 50 } else if (ex.getClass().equals(ClassNotFoundException.class)) 51 { 52 ex.printStackTrace(); 53 throw new BusinessException("指定的类不存在!"); 54 } else if (ex.getClass().equals(ArithmeticException.class)) 55 { 56 ex.printStackTrace(); 57 throw new BusinessException("数学运算异常!"); 58 } else if (ex.getClass().equals(ArrayIndexOutOfBoundsException.class)) 59 { 60 ex.printStackTrace(); 61 throw new BusinessException("数组下标越界!"); 62 } else if (ex.getClass().equals(IllegalArgumentException.class)) 63 { 64 ex.printStackTrace(); 65 throw new BusinessException("方法的参数错误!"); 66 } else if (ex.getClass().equals(ClassCastException.class)) 67 { 68 ex.printStackTrace(); 69 throw new BusinessException("类型强制转换错误!"); 70 } else if (ex.getClass().equals(SecurityException.class)) 71 { 72 ex.printStackTrace(); 73 throw new BusinessException("违背安全原则异常!"); 74 } else if (ex.getClass().equals(SQLException.class)) 75 { 76 ex.printStackTrace(); 77 throw new BusinessException("操作数据库异常!"); 78 } else if (ex.getClass().equals(NoSuchMethodError.class)) 79 { 80 ex.printStackTrace(); 81 throw new BusinessException("方法末找到异常!"); 82 } else if (ex.getClass().equals(InternalError.class)) 83 { 84 ex.printStackTrace(); 85 throw new BusinessException("Java虚拟机发生了内部错误"); 86 } else 87 { 88 ex.printStackTrace(); 89 throw new BusinessException("程序内部错误,操作失败!" + ex.getMessage()); 90 } 91 } 92 }
1 自定义业务异常处理类 友好提示: 2 3 package com.pilelot.web.util; 4 5 /** 6 * 自定义业务异常处理类 友好提示 7 * @author Andy Chan 8 * 9 */ 10 public class BusinessException extends RuntimeException 11 { 12 private static final long serialVersionUID = 3152616724785436891L; 13 14 public BusinessException(String frdMessage) 15 { 16 super(createFriendlyErrMsg(frdMessage)); 17 } 18 19 public BusinessException(Throwable throwable) 20 { 21 super(throwable); 22 } 23 24 public BusinessException(Throwable throwable, String frdMessage) 25 { 26 super(throwable); 27 } 28 29 private static String createFriendlyErrMsg(String msgBody) 30 { 31 String prefixStr = "抱歉,"; 32 String suffixStr = " 请稍后再试或与管理员联系!"; 33 34 StringBuffer friendlyErrMsg = new StringBuffer(""); 35 36 friendlyErrMsg.append(prefixStr); 37 38 friendlyErrMsg.append(msgBody); 39 40 friendlyErrMsg.append(suffixStr); 41 42 return friendlyErrMsg.toString(); 43 }
统一日志处理实现类: package com.pilelot.web.util; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.apache.log4j.Logger; /** * Spring 统一日志处理实现类 * @author Andy Chan * */ public class LogInterceptor implements MethodInterceptor { public Object invoke(MethodInvocation invocation) throws Throwable { Logger loger = Logger.getLogger(invocation.getClass()); loger.info("--Log By Andy Chan -----------------------------------------------------------------------------"); loger.info(invocation.getMethod() + ":BEGIN!--(Andy ChanLOG)");// 方法前的操作 Object obj = invocation.proceed();// 执行需要Log的方法 loger.info(invocation.getMethod() + ":END!--(Andy ChanLOG)");// 方法后的操作 loger.info("-------------------------------------------------------------------------------------------------"); return obj; } }
44
Spring配置文件添加: <!-- Spring 统一日志处理 LogInterceptor拦截器 配置 --> <bean id="logLnterceptor" class="com.pilelot.web.util.LogInterceptor"/> <!-- Spring 统一异常处理 ExceptionAdvisor配置 --> <bean id="exceptionHandler" class="com.pilelot.web.util.ExceptionAdvisor"></bean> <!-- Bean自动代理处理器 配置--> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" > <property name="beanNames"> <list> <!-- 配置需要进行日志记录的Service和Dao --> <value>commonDao</value> <!-- 配置所有Service结尾命名的Bean,即所有Service层的类都要经过exceptionHandler异常处理类 --> <value>*Service</value> <!-- Service层的Bean ID 命名要以Service结尾 --> </list> </property> <property name="interceptorNames"> <list> <value>exceptionHandler</value> <value>logLnterceptor</value> <!--<value>transactionInterceptor</value>--> </list> </property> </bean> <!-- ——————————————————Spring 统一日志处理 + 统一异常处理 配置结束—————————————悲伤的分隔线—————————— -->
}
我曾七次鄙视自己的灵魂: 第一次,当它本可进取时,却故作谦卑; 第二次,当它空虚时,用爱欲来填充; 第三次,在困难和容易之间,它选择了容易; 第四次,它犯了错,却借由别人也会犯错来宽慰自己; 第五次,它自由软弱,却把它认为是生命的坚韧; 第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副; 第七次,它侧身于生活的污泥中虽不甘心,却又畏首畏尾.