springboot整合日志
工具:idea2020
环境:jdk1.8,maven3.x,springboot,Lombok插件
开始整合吧~
1.项目中resources文件夹下,编写log4j.properties文件
#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=/Users/dddd/Documents/testspace/pms-api-services/logs/info/api_services_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=/Users/dddd/Documents/testspace/pms-api-services/logs/error/api_services_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=/Users/dddd/Documents/testspace/pms-api-services/logs/debug/api_services_debug
log4j\u4EE3\u7801
private static final Logger logger = LoggerFactory.getLogger(IndexController.class);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2. pom.xml文件中引入日志依赖
pom.xml文件中导入依赖
org.springframework.boot spring-boot-starter-aop 1 2 3 4 5 编写Aop处理日志的文件 @Component @Aspect //把当前类标识为一个切面供容器读取 public class AspectTest { // 获取日志对象 logger private static final Logger logger = LoggerFactory.getLogger(AspectTest.class);//配置切点
@Pointcut("execution(public * com.yousian.controller.AspectController.*(..))")
public void webLog() {
}
//前置增强
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
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));
}
}
// 后置增强
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) {
// 处理完请求,返回内容
log.info("RESPONSE : " + ret);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
编写AspectController文件
@RestController
public class AspectController {
@RequestMapping("aop")
public String getAopInfo(String name,Integer age){
return "success";
}
}
1
2
3
4
5
6
7
8
项目结构
在这里插入图片描述
运行。(运行Application.java)
在这里插入图片描述
在这里插入图片描述
4.优化代码
①
@Before(“execution(public * com.yousian.controller.AspectController.*(…))”)
===代替
@Pointcut(“execution(public * com.yousian.controller.AspectController.*(…))”)
public void webLog() {
}
@Before(“webLog()”)
@AfterReturning(returning = “ret”, pointcut = “execution(public * com.yousian.controller.AspectController.*(…))”)
===代替
@AfterReturning(returning = “ret”, pointcut = “webLog()”)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
② 使用Lombok插件(首次安装必须联网)
进入idea中settings,找到plugins搜索Lombok点击Marketplace,找到Lombok点击Install按钮,下载完成后,点击restartIDEA。安装完成
在这里插入图片描述
pom.xml文件中导入Lambok依赖
org.projectlombok lombok 1 2 3 4 5 AspectTest日志处理文件中,添加一个注解@Slf4j ,然后删除代码:private static final Logger logger = LoggerFactory.getLogger(AspectTest.class);,使用Lombok插件自带的log对象取代logger 最终结果如下: @Component @Aspect //把当前类标识为一个切面供容器读取 @Slf4j //lombok 插件中的注解 使用后可以优化代码 即 省略日志对象logger的获取 public class AspectTest { // 配置切点 + 前置增强 @Before("execution(public * com.yousian.controller.AspectController.*(..))") public void doBefore(JoinPoint joinPoint) { // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 记录下请求内容 log.info("URL : " + request.getRequestURL().toString()); log.info("HTTP_METHOD : " + request.getMethod()); log.info("IP : " + request.getRemoteAddr()); Enumeration enu = request.getParameterNames(); while (enu.hasMoreElements()) { String name = (String) enu.nextElement(); log.info("name:{},value:{}", name, request.getParameter(name)); } }// 后置增强
@AfterReturning(returning = "ret", pointcut = "execution(public * com.yousian.controller.AspectController.*(..))")
public void doAfterReturning(Object ret) {
// 处理完请求,返回内容
log.info("RESPONSE : " + ret);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
终于到了运行时刻,是不是有点小激动呢?找到Application.java项目启动文件启动查看结果吧~
5. 小结(借鉴了一点资料(⊙o⊙))
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
AOP是OOP的延续,是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
spring AOP中业务逻辑仅仅只关注业务本身,将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,使得改变这些行为的时候不影响业务逻辑的代码。
@Aspect 常见用于记录日志、异常集中处理、权限验证、Web 参数校验、事务处理等等
相关注解介绍
@Aspect:作用是把当前类标识为一个切面供容器读取
@Pointcut:Pointcut是植入Advice的触发条件。每个Pointcut的定义包括2部分,一是表达式,二是方法签名。方法签名必须是 public及void型。可以将Pointcut中的方法看作是一个被Advice引用的助记符,因为表达式不直观,因此我们可以通过方法签名的方式为 此表达式命名。因此Pointcut中的方法只需要方法签名,而不需要在方法体内编写实际代码。
@Around:环绕增强,相当于MethodInterceptor
@AfterReturning:后置增强,相当于AfterReturningAdvice,方法正常退出时执行
@Before:标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有
@AfterThrowing:异常抛出增强,相当于ThrowsAdvice
@After: final增强,不管是抛出异常或者正常退出都会执行