日志使用场景:在实际开发中,服务器控制台日志可以帮助程序员定位出错代码,修复程序漏洞。
第一步:引入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)执行业务类的时候,控制台是否有对应的日志信息输出