spring boot使用AOP技术统一处理日志
spring boot学习笔记之使用AOP技术统一处理日志
话休繁絮,直接进入正题.spring boot项目中使用aop技术处理日志
本文代码的前提是:
1 AOP技术的基础知识
2 idea已安装了lombok插件(至于怎么安装的,请自行百度,很简单的)
3 使用idea创建spring boot项目com.jsone.springbootlog,并配置好maven(很简单的,自行百度,后面有可能也会写这个内容的博客,敬请关注吆)
本文会分为两个方面讲解日志打印
1 传统的日志打印技术
2 使用lombok插件的日志打印,但lombok的本质是使用字节码技术在Java文件编译的时候生成传统方式中的那些代码,其原理还是传统的日志打印方式
1 pom文件中导入AOP相关依赖
<dependency><!--spring boot使用aop技术打印日志 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.0.6.RELEASE</version>
</dependency>
2 日志的打印
2.1 传统的日志打印,使用log4j打印日志
2.1.1:pom中导入依赖
<dependency> <!--spring boot整合log4j -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
2.1.2:在src\main\resources目录下放入log4j.properties文件
此文件仅做参考,网上有很多log4j的properties文件,其中log4j.appender.DEBUG.File的值要改为自己的本地路径
#log4j.rootLogger=CONSOLE,info,error,DEBUG
log4j.rootLogger=info,error,CONSOLE,DEBUG
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.info.datePattern='.'yyyy-MM-dd
log4j.appender.info.Threshold = info
log4j.appender.info.append=true
#log4j.appender.info.File=/home/admin/pms-api-services/logs/info/api_services_info
log4j.appender.info.File=D:/logs/info
log4j.logger.error=error
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.error.datePattern='.'yyyy-MM-dd
log4j.appender.error.Threshold = error
log4j.appender.error.append=true
#log4j.appender.error.File=/home/admin/pms-api-services/logs/error/api_services_error
log4j.appender.error.File=D:/logs/error
log4j.logger.DEBUG=DEBUG
log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout
log4j.appender.DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.DEBUG.datePattern='.'yyyy-MM-dd
log4j.appender.DEBUG.Threshold = DEBUG
log4j.appender.DEBUG.append=true
#log4j.appender.DEBUG.File=/home/admin/pms-api-services/logs/debug/api_services_debug
log4j.appender.DEBUG.File=D:/logs/debug
2.1.3:创建AOP切面:在src\main\java\com\jsone\springbootlog目录下创建一个包,例如:aop,然后创建Java文件,例如:WebLogAspect.代码如下:
@Aspect//标识是一个切面
@Component//实例化
public class WebLogAspect {
private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
//切入点
@Pointcut("execution(public * com.itmayiedu.controller.*.*(..))")//要写自己的包名
public void webLog() {
}
//目标方法执行之前打印一下日志
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容,一般日志是会存放在nosql数据库中的,时间大概是半年,国家标准,日志必须存至少半年
logger.info("URL : " + request.getRequestURL().toString());
logger.info("HTTP_METHOD : " + request.getMethod());
logger.info("IP : " + request.getRemoteAddr());
Enumeration<String> enu = request.getParameterNames();//用servlet来获取参数
while (enu.hasMoreElements()) {
String name = (String) enu.nextElement();
logger.info("name:{},value:{}", name, request.getParameter(name));
}
}
//目标方法返回之后打印日志
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable {//这个object参数就是controller层中返回的内容
// 处理完请求,返回内容
logger.info("RESPONSE : " + ret);
}
}
2.1.4:测试:在src\main\java\com\jsone\springbootlog目录下创建一个controller包,然后创建Java文件,例如:TestController.代码如下:
@RestController
public class TestController {
@RequestMapping("/test")
public String test(String name) {
return "success" + name;
}
}
2.1.5:运行项目:效果如下:
2.2 使用lombok插件的日志打印
2.2.1:安装lombok插件(网上有教程),pom中导入依赖
<dependency><!--spring boot使用lombok插件简化代码 -->
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
2.2.2:在src\main\resources目录下放入log4j.properties文件,跟上面的log4j.properties文件代码一样
2.2.3:创建AOP切面:在src\main\java\com\jsone\springbootlog目录下创建一个包,例如:aop,然后创建Java文件,例如:WebLogAspect.代码如下:
@Aspect
@Component
@Slf4j
public class WebLogAspect {
@Pointcut("execution(public * com.jsone.springbootlog.controller.*.*(..))")//这个包名要填自己的
public void webLog() {
}
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容,一般日志是会存放在nosql数据库中的,时间大概是半年,国家标准,日志必须存至少半年
log.info("URL : " + request.getRequestURL().toString());
log.info("HTTP_METHOD : " + request.getMethod());
log.info("IP : " + request.getRemoteAddr());
Enumeration<String> enu = request.getParameterNames();
while (enu.hasMoreElements()) {
String name = (String) enu.nextElement();
log.info("name:{},value:{}", name, request.getParameter(name));//用servlet来获取参数
}
}
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable {
// 处理完请求,返回内容
log.info("RESPONSE : " + ret);
}
}
跟传统方式日志打印的区别在于:添加 @Slf4j注解,使用lombok插件中的log来打印日志,其实lombok的原理是使用字节码技术在Java文件编译的时间生成 private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);这行代码,
2.2.4:运行项目:效果一样的:
3 结束语:
本文代码git地址:https://github.com/jiasen123/springboot-log.git
这是本人的第一篇博客,写的不是很好,本人也是一个小白,写的时候是按一个小白的理解去写的,可能有很多不规范,不正确的地方,欢迎各位大神指正,所有人的留言我都会认真看的,谢谢大家