参考
package org.digdata.swustoj.exception;
import java.io.IOException;
import java.lang.reflect.Method;
import java.sql.SQLException;
import org.apache.log4j.Logger;
import org.digdata.swustoj.util.ClassUtil;
import org.springframework.aop.ThrowsAdvice;
import org.springframework.dao.DataAccessException;
/**
*
* @author wwhhf
* @since 2016年5月20日
* @comment 异常通知消息,将一般运行时异常封装为业务运行异常
*/
public class ExceptionAdvisor implements ThrowsAdvice {
/**
*
* @author wwhhf
* @since 2016年5月20日
* @comment 一般运行异常抛出之后的处理
* @param method
* @param args
* @param target
* @param ex
* @throws Throwable
*/
public void afterThrowing(Method method, Object[] args, Object target,
Exception ex) throws Throwable {
String methodInfo=ClassUtil.getMethodInfo(target.getClass(), method, args);
Logger logger = Logger.getLogger(target.getClass());
logger.error("**************************************************************");
logger.error("method happen: " + methodInfo);
logger.error("Exception class: " + ex.getClass().getName());
logger.error("ex.getMessage():" + ex.getMessage());
logger.error("**************************************************************");
if (ex.getClass().equals(DataAccessException.class)) {
ex.printStackTrace();
throw new BusinessException("数据库操作失败!");
} else if (ex.getClass().toString()
.equals(NullPointerException.class.toString())) {
ex.printStackTrace();
throw new BusinessException("调用了未经初始化的对象或者是不存在的对象!");
} else if (ex.getClass().equals(IOException.class)) {
ex.printStackTrace();
throw new BusinessException("IO异常!");
} else if (ex.getClass().equals(ClassNotFoundException.class)) {
ex.printStackTrace();
throw new BusinessException("指定的类不存在!");
} else if (ex.getClass().equals(ArithmeticException.class)) {
ex.printStackTrace();
throw new BusinessException("数学运算异常!");
} else if (ex.getClass().equals(ArrayIndexOutOfBoundsException.class)) {
ex.printStackTrace();
throw new BusinessException("数组下标越界!");
} else if (ex.getClass().equals(IllegalArgumentException.class)) {
ex.printStackTrace();
throw new BusinessException("方法的参数错误!");
} else if (ex.getClass().equals(ClassCastException.class)) {
ex.printStackTrace();
throw new BusinessException("类型强制转换错误!");
} else if (ex.getClass().equals(SecurityException.class)) {
ex.printStackTrace();
throw new BusinessException("违背安全原则异常!");
} else if (ex.getClass().equals(SQLException.class)) {
ex.printStackTrace();
throw new BusinessException("操作数据库异常!");
} else if (ex.getClass().equals(NoSuchMethodError.class)) {
ex.printStackTrace();
throw new BusinessException("方法末找到异常!");
} else if (ex.getClass().equals(InternalError.class)) {
ex.printStackTrace();
throw new BusinessException("Java虚拟机发生了内部错误");
} else {
ex.printStackTrace();
throw new BusinessException("程序内部错误,操作失败!" + ex.getMessage());
}
}
}
package org.digdata.swustoj.exception;
import java.lang.reflect.Method;
import org.apache.log4j.Logger;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
/**
*
* @author wwhhf
* @since 2016年5月20日
* @comment 方法执行前和方法执行后的结果的日志记录
*/
public class LogMethodAdvice implements MethodBeforeAdvice,
AfterReturningAdvice {
/**
*
* @author wwhhf
* @since 2016年5月20日
* @comment 拼装字符串
* @param clazz
* @param method
* @param args
* @return
*/
private String getMethodInfo(Class clazz, Method method, Object[] args) {
StringBuffer sb = new StringBuffer(clazz.getName() + " "
+ method.getName()).append("(");
for (int i = 0, len = args.length; i < len; i++) {
if (i != 0) {
sb.append(",");
}
sb.append(args[i]);
}
sb.append(")");
return sb.toString();
}
@Override
public void afterReturning(Object returnValue, Method method,
Object[] args, Object target) throws Throwable {
Logger logger = Logger.getLogger(target.getClass());
String methodInfo=getMethodInfo(target.getClass(), method, args);
logger.info(methodInfo+" result is : " + returnValue);
logger.info("======================");
}
@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
Logger logger = Logger.getLogger(target.getClass());
logger.info("======================");
String methodInfo=getMethodInfo(target.getClass(), method, args);
logger.info(methodInfo+" is running");
}
}
package org.digdata.swustoj.exception;
/**
*
* @author wwhhf
* @since 2016年5月20日
* @comment 业务运行时异常
*/
public class BusinessException extends RuntimeException {
private static final long serialVersionUID = 3152616724785436891L;
public BusinessException(String frdMessage) {
super(createFriendlyErrMsg(frdMessage));
}
public BusinessException(Throwable throwable) {
super(throwable);
}
public BusinessException(Throwable throwable, String frdMessage) {
super(throwable);
}
private static String createFriendlyErrMsg(String msgBody) {
String prefixStr = "抱歉,";
String suffixStr = " 请稍后再试或与管理员联系!";
StringBuffer friendlyErrMsg = new StringBuffer("");
friendlyErrMsg.append(prefixStr);
friendlyErrMsg.append(msgBody);
friendlyErrMsg.append(suffixStr);
return friendlyErrMsg.toString();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<bean id="logMethodAdvice" class="org.digdata.swustoj.exception.LogMethodAdvice" />
<bean id="exceptionAdvisor" class="org.digdata.swustoj.exception.ExceptionAdvisor" />
<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*Dao*</value>
<value>*Service*</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>exceptionAdvisor</value>
<value>logMethodAdvice</value>
</list>
</property>
</bean>
</beans>
@Override
public List<Tags> selectTags(List<Integer> search_ids, String search_name,
String condition, Integer page, Integer rows) {
Map<String, Object> params = new HashMap<>();
params.put("search_ids", search_ids);
params.put("search_name", search_name != null ? "%" + search_name + "%"
: null);
params.put("condition", condition);
params.put("start", page != null && rows != null ? (page - 1) * rows
: null);
params.put("rows", page != null && rows != null ? rows : null);
return this
.getSqlSession()
.selectList(
"org.digdata.swustoj.mybatis.dao.TagsMapper.selectTags",
params);
}
/**
*
* @author wwhhf
* @since 2016年5月18日
* @comment 条件查询Tags
* @param search_ids
* @param search_name
* @param page
* @param rows
* @return
*/
@ResponseBody
@RequestMapping(value = "/selectTags.do", method = { RequestMethod.POST,
RequestMethod.GET })
public JsonAndModel selectTags(String search_ids, String search_name,
Integer page, Integer rows) {
try {
Map<String, Object> res = this.tagsService.selectTags(search_ids,
search_name, page, rows);
if (res == null) {
return new JsonAndModel(JsonAndModel.ERROR);
} else {
return new JsonAndModel(JsonAndModel.SUCCESS).addAttrs(res);
}
} catch (BusinessException e) {
return new JsonAndModel(JsonAndModel.ERROR);
}
}
### ERROR 为严重错误
### WARN 为一般警告
### INFO 为一般要显示的信息,比如登录登出
### DEBUG 为程序的调试信息
# %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
# %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
# %r: 输出自应用启动到输出该log信息耗费的毫秒数
# %c: 输出日志信息所属的类目,通常就是所在类的全名
# %t: 输出产生该日志事件的线程名
# %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)
# %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
# %%: 输出一个"%"字符
# %F: 输出日志消息产生时所在的文件名称
# %L: 输出代码中的行号
# %m: 输出代码中指定的消息,产生的日志具体信息
# %n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行
### 设置 ###
### 最低输出等级和输出appender
#log4j.rootLogger = DEBUG,appender_debug,appender_info,appender_warn,appender_error
#################################### 控制台 ##########################################
### 输出至控制台
log4j.appender.appender_console = org.apache.log4j.ConsoleAppender
### 日志立马刷新
log4j.appender.appender_console.ImmediateFlush=true
### 指定输出控制台
log4j.appender.appender_console.Target = System.out
### 样式
log4j.appender.appender_console.layout = org.apache.log4j.PatternLayout
log4j.appender.appender_console.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
#################################### 控制台 ##########################################
#################################### 文件 ###########################################
##################### debug
### 每日滚动文件
log4j.appender.appender_debug = org.apache.log4j.DailyRollingFileAppender
### 输出的文件路径
log4j.appender.appender_debug.File = logs/debug.log
### 是否追加
log4j.appender.appender_debug.Append = true
### 输出的最低等级
log4j.appender.appender_debug.Threshold = DEBUG
### 所有的消息都会被立即输出
log4j.appender.appender_debug.ImmediateFlush = true
### 样式
log4j.appender.appender_debug.layout = org.apache.log4j.PatternLayout
log4j.appender.appender_debug.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
##################### info
### 每日滚动文件
log4j.appender.appender_info = org.apache.log4j.DailyRollingFileAppender
### 输出的文件路径
log4j.appender.appender_info.File = logs/info.log
### 是否追加
log4j.appender.appender_info.Append = true
### 输出的最低等级
log4j.appender.appender_info.Threshold = INFO
### 所有的消息都会被立即输出
log4j.appender.appender_info.ImmediateFlush = true
### 样式
log4j.appender.appender_info.layout = org.apache.log4j.PatternLayout
log4j.appender.appender_info.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
##################### warn
### 每日滚动文件
log4j.appender.appender_warn = org.apache.log4j.DailyRollingFileAppender
### 输出的文件路径
log4j.appender.appender_warn.File = logs/warn.log
### 是否追加
log4j.appender.appender_warn.Append = true
### 输出的最低等级
log4j.appender.appender_warn.Threshold = WARN
### 所有的消息都会被立即输出
log4j.appender.appender_warn.ImmediateFlush = true
### 样式
log4j.appender.appender_warn.layout = org.apache.log4j.PatternLayout
log4j.appender.appender_warn.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
##################### error
### 每日滚动文件
log4j.appender.appender_error = org.apache.log4j.DailyRollingFileAppender
### 输出的文件路径
log4j.appender.appender_error.File = logs/error.log
### 是否追加
log4j.appender.appender_error.Append = true
### 输出的最低等级
log4j.appender.appender_error.Threshold = ERROR
### 所有的消息都会被立即输出
log4j.appender.appender_error.ImmediateFlush = true
### 样式
log4j.appender.appender_error.layout = org.apache.log4j.PatternLayout
log4j.appender.appender_error.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
#################################### 文件 ###########################################
### 指定包设定默认输出等级
log4j.logger.noModule = FATAL
log4j.logger.com.opensymphony.xwork2 = ERROR
log4j.logger.org.apache.struts2 = ERROR
log4j.logger.org.mybatis = DEBUG
log4j.logger.org.springframework = DEBUG
log4j.logger.freemarker = INFO
log4j.logger.com.opensymphony = DEBUG
log4j.logger.com.opensymphony.xwork2.ognl = ERROR
log4j.logger.org.apache.struts2.threshold = INFO
log4j.logger.org.apache.struts2.components = DEBUG
log4j.logger.org.apache.struts2.dispatcher = DEBUG
log4j.logger.org.apache.struts2.convention = INFO
log4j.logger.java.sql.Statement = DEBUG
log4j.logger.java.sql.Connection = DEBUG
log4j.logger.java.sql.PreparedStatement = DEBUG
log4j.logger.org.apache.commons.dbcp.dataSource = DEBUG
log4j.logger.com.alibaba.druid.pool.DruidDataSource = DEBUG