Spring 异常捕获+log4j日志

参考

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">

    <!-- Spring 方法调用前后切面日志处理 -->
    <bean id="logMethodAdvice" class="org.digdata.swustoj.exception.LogMethodAdvice" />
    <!-- Spring 异常通知 -->
    <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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值