AOP+log4j记录日志

2 篇文章 0 订阅

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

1.添加log4j.properties

log4j.rootLogger=INFO,A1,R,E
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} [%p] %m%n
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=../log/Logs.log
log4j.appender.R.DatePattern='.'yyyy-MM-dd
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} [%p] %m%n
log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.Threshold=ERROR
log4j.appender.E.File=../log/Errors.log
log4j.appender.E.DatePattern='.'yyyy-MM-dd
log4j.appender.E.layout=org.apache.log4j.PatternLayout
log4j.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日志

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值