spring boot使用AOP技术统一处理日志

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
这是本人的第一篇博客,写的不是很好,本人也是一个小白,写的时候是按一个小白的理解去写的,可能有很多不规范,不正确的地方,欢迎各位大神指正,所有人的留言我都会认真看的,谢谢大家

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值