AOP+log4j记录日志

来源:互联网 发布:神盾网络验证山寨 编辑:程序博客网 时间:2024/06/05 19:15

     在已开发完的项目中添加日志,使用切面比较方便,下述即为AOP+Log4j记录项目中日志的方法。

1.添加log4j.properties

log4j.rootLogger=INFO,A1,R,Elog4j.appender.A1=org.apache.log4j.ConsoleAppenderlog4j.appender.A1.layout=org.apache.log4j.PatternLayoutlog4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} [%p] %m%nlog4j.appender.R=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.R.File=../log/Logs.loglog4j.appender.R.DatePattern='.'yyyy-MM-ddlog4j.appender.R.layout=org.apache.log4j.PatternLayoutlog4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} [%p] %m%nlog4j.appender.E=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.E.Threshold=ERRORlog4j.appender.E.File=../log/Errors.loglog4j.appender.E.DatePattern='.'yyyy-MM-ddlog4j.appender.E.layout=org.apache.log4j.PatternLayoutlog4j.appender.E.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} [%p] %l %m%n
log4j的详细配置可参考:Log4J日志配置详解、log4j详细配置文件


2.新建LogInterceptor.java

public class LogInterceptor{    private final Logger logger = Logger.getLogger(LogInterceptor.class);//log4j/**     * 前置方法,在目标方法执行前执行     */    public void before(JoinPoint joinPoint){    Map<String,String> map = ParameterUtil.getParameters();    String methodName = joinPoint.getSignature().getName();        String entity = joinPoint.getTarget().getClass().getName();    logger.info("start! "+entity+"."+methodName+" data:"+map.toString());    }        /**     * 后置方法,在目标方法执行后执行     */   /* public void after(JoinPoint joinPoint){    String methodName = joinPoint.getSignature().getName();        String entity = joinPoint.getTarget().getClass().getName();        logger.info("end! "+entity+"."+methodName);    }*/            public Object  around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{    String methodName = proceedingJoinPoint.getSignature().getName();        String entity = proceedingJoinPoint.getTarget().getClass().getName();        Object result =null;        try {result = proceedingJoinPoint.proceed();        } catch (Exception ex) {                HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);        //获取请求的URL            StringBuffer requestURL = request.getRequestURL();            //获取参 数信息            String queryString = request.getQueryString();             //封装完整请求URL带参数            if(queryString != null){                  requestURL .append("?").append(queryString);              }                    String errorMsg = "";StackTraceElement[] trace = ex.getStackTrace();for (StackTraceElement s : trace) {    errorMsg += "\tat " + s + "\r\n";}StringBuffer sb=new StringBuffer();sb.append("frontend-exception!!!\r\n");            sb.append("   请求URL:"+requestURL+"\r\n");            sb.append("   方法:"+entity+"."+methodName+"\r\n");            sb.append("   详细错误信息:"+ex+"\r\n");            sb.append(errorMsg+"\r\n");            logger.error(sb.toString());        }        return result;    }}
3.配置bean.xml

<!-- 激活自动代理功能 -->        <aop:aspectj-autoproxy proxy-target-class="true" />                <!-- 将日志类注入到bean中 -->        <bean id="logInterceptor" class="com.intercepter.LogInterceptor" /><aop:config>      <aop:aspect id="logAspect" ref="logInterceptor">      <aop:pointcut expression="execution(* com.test..*.*(..))" id="logPointCut"/>      <aop:before method="before" pointcut-ref="logPointCut"/>    <!-- <aop:after method="after" pointcut-ref="logPointCut" /> -->    <!-- <aop:after-throwing method="afterThrow" pointcut-ref="logPointCut" throwing="ex"/> -->    <aop:around method="around" pointcut-ref="logPointCut" />    </aop:aspect>  </aop:config>

4.在具体类中,有异常时,直接抛出即可,AOP会catch到并处理记录。

注解方法可参考:spring aop 切面记录log4j日志

原创粉丝点击