spring aop整合log4j实现简单日志输出

日志使用场景:在实际开发中,服务器控制台日志可以帮助程序员定位出错代码,修复程序漏洞。

第一步:引入jar包
在这里插入图片描述
第二步:在web.xml配置日志监听器

<!-- 配置日志   start-->
<!-- 加载Log4J 配置文件  -->  
<context-param>  
 <param-name>log4jConfigLocation</param-name>  
 <param-value> classpath:log4j.properties</param-value>  
</context-param>
     
<context-param>  
 <param-name>log4jRefreshInterval</param-name>  
 <param-value>3000</param-value>  
</context-param>
  
<listener>  
 <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
</listener>
<!-- 配置日志   end-->

第三步:编辑日志配置文件

#设置级别
log4j.rootLogger=debug,appender1
#输出到文件(这里默认为追加方式)  
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#设置文件输出样式
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout

第四步:设置aop自动代理和配置切面

<aop:aspectj-autoproxy proxy-target-class="true"/>

<bean id = "logAspect" class = "com.web.aspect.LogAspect"></bean>

<aop:config>
 <aop:aspect id="LogAspect" ref="logAspect">
  <aop:pointcut expression="execution(* com.web.Service.*.*(..))" id="logPointCut"/>
  <!-- 原来是写com.web.service,实际上项目的package是com.web.Service -->
  <aop:before method="doBefore" pointcut-ref="logPointCut"/>
  <aop:after method="after" pointcut-ref="logPointCut"/>
  <aop:around method="Around" pointcut-ref="logPointCut"/>
  <aop:after-returning method="AfterReturning" pointcut-ref="logPointCut"/>
  <aop:after-throwing method="AfterThrowing" pointcut-ref="logPointCut" throwing="error"/>
 </aop:aspect>
</aop:config>

第五步:编辑切面类

package com.web.aspect;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
public class LogAspect {
 Logger logger=Logger.getLogger(LogAspect.class);
 public void doBefore(JoinPoint point){
  logger.info("【"+point.getKind()+"】方法执行前,当前时间:"+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        // 记录下请求内容
        logger.info("【"+point.getKind()+"】请求URL : " + request.getRequestURL().toString());
        logger.info("【"+point.getKind()+"】请求方法 : " + request.getMethod());
        logger.info("【"+point.getKind()+"】IP地址 : " + request.getRemoteAddr());
 }
 //定义通知,方法执行后
    public void after(JoinPoint point){
        logger.info("【"+point.getKind()+"】方法执行后,当前时间:"+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }
 //定义通知,方法返回前
    public void AfterReturning(JoinPoint point){
        logger.info("【"+point.getKind()+"】方法返回前,当前时间:"+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }
    //定义通知,抛出异常
    public void AfterThrowing(Throwable error){
        logger.info("方法报错,当前时间:"+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }
    //定义通知环绕型
    public Object Around (ProceedingJoinPoint pjp) throws Throwable{
        logger.info("【"+pjp.getKind()+"】环绕前:"+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        Object obj= pjp.proceed();
        logger.info("【"+pjp.getKind()+"】环绕后:"+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        return obj;
    }
}

补充说明:结合log4j检查aop是否配置成功小技巧
(1)启动服务器的时候,日志里面是否aop的日志信息
(2)执行业务类的时候,控制台是否有对应的日志信息输出

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值