1.pom依赖的剔除和引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!--排除自带的日志jar包,整合其他日志-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--使用需要的日志框架-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
2.创建log4j.properties文件(与application.yml同级别)
log4j.rootLogger=DEBUG,stdout,file
log4j.additivity.org.apache=true
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.threshold=INFO
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.file.Threshold=INFO
log4j.appender.file.append=true
log4j.appender.file.File=/workspaces/logs/foodie-api/foodie.log
3.使用日志监控service层执行时间.
引入依赖
<!--面向切面编程-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
创建切面类
package com.shixin.aspct;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* <b>监控Service层执行<b/>
* @Author shixin
* @Date 2021/6/23 15:52
*/
@Aspect
@Component
public class ServiceLogAspect {
public static final Logger log = LoggerFactory.getLogger(ServiceLogAspect.class);
/*
* Aop通知
* 1.前置通知 : 在方法调用之前执行
* 2.猴子通知 : 在方法正常调用之后执行
* 3.环绕通知 : 在方法调用之前和之后,都分别可以执行的通知
* 4.异常通知 : 方法调用过程之中发生异常,则通知
* 5.最终通知 : 在方法调用之后执行
* */
/**
* 切面表达式<br/>
* execution 代表所要执行的表达式主体<br/>
* 第一处 * 代表方法返回类型 *代表所有类型<br/>
* 第二处 包名代表aop监控的类所在的包<br/>
* 第三处 .. 代表该包以及其子包下所有的类方法<br/>
* 第四处 * 代表类名,*代表所有类<br/>
* 第五处 *(..) *代表类中的方法名,(..)表示方法中的任何参数
* @param: joinPoint
* @return: Object
* @Date: 2021/6/23
*/
@Around("execution(* com.shixin.service.impl..*.*(..))")
public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("======= 开始执行 {}.{} =======" , joinPoint.getTarget().getClass(),joinPoint.getSignature().getName());
long begin = System.currentTimeMillis();
Object proceed = joinPoint.proceed();
long end = System.currentTimeMillis();
long takeTime = end - begin;
if (takeTime>3000){
log.error("======= 执行结束 , 耗时:{} 毫秒" ,takeTime);
}else if (takeTime > 2000){
log.warn("======= 执行结束 , 耗时:{} 毫秒" ,takeTime);
}else {
log.info("======= 执行结束 , 耗时:{} 毫秒" ,takeTime);
}
return proceed;
}
}