为你的项目配置日志(AOP+logback)

文章目录

    • 1、导入依赖
    • 2、配置文件logback-spring.xml
    • 3、使用AOP做日志
      • 3.1、自定义注解
      • 3.2、自定义aop切面
    • 4、在controller方法上添加注解
    • 5、使用@Slf4j
    • 6、最终参考效果

之前看过logback的配置方法,今天整理spring的知识的时候,又看到了aop,想着把他两个弄起来,打印在控制台的信息,比较好看,顺便也能写在日志文件中,我也不知道这样做好不好,反正是做个小记录!

1、导入依赖

<dependency>
    <groupId>org.projectlombokgroupId>
    <artifactId>lombokartifactId>
dependency>
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-aopartifactId>
dependency>

2、配置文件logback-spring.xml


修改路径、日志文件名啥的,然后将该配置文件放到resources目录下


<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />


    
    <property name="LOG_PATH" value="${user.dir}/logs" />
    
    <property name="LOG_FILE" value="${LOG_PATH}/log_name.log" />

    
    <appender name="APPLICATION"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        <file>${LOG_FILE}file>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.logfileNamePattern>
            
            <maxHistory>7maxHistory>
            
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MBmaxFileSize>
            timeBasedFileNamingAndTriggeringPolicy>
        rollingPolicy>
        
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%npattern>
        layout>
    appender>
    
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%green(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%magenta(%thread)] %highlight(%-5level) %yellow(%logger{36}): %msg%npattern>
        layout>
    appender>

    
    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="APPLICATION" />
    root>
configuration>

<property name="LOG_PATH" value="${user.dir}/logs" />

<property name="LOG_FILE" value="${LOG_PATH}/log_name.log" />

可以修改这两个东西,可以通过下面的方法看看路径啥的是否正确

public static void main(String[] args) {
    System.out.println(System.getProperty("user.dir"));
}

3、使用AOP做日志

3.1、自定义注解

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD})
@Documented
public @interface WebLog {
}

3.2、自定义aop切面

@Aspect
@Component
public class WebLogAspect {
    private final static Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
	// 下面这个com.customInterface.WebLog要修改成你对应自定义注解的路径
    @Pointcut("@annotation(com.customInterface.WebLog)")
    public void webLog() {}

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws JsonProcessingException {
        ServletRequestAttributes requestAttributes
                = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();

        // 打印请求相关参数
        logger.info("========================================== Start ==========================================");
        // 打印请求 url
        logger.info("URL            : {}", request.getRequestURL().toString());
        // 打印 Http method
        logger.info("HTTP Method    : {}", request.getMethod());
        // 打印调用 controller 的全路径以及执行方法
        logger.info("Class Method   : {}.{}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName());
        // 打印请求的 IP
        logger.info("IP             : {}", request.getRemoteAddr());
        // 打印请求入参
        logger.info("Request Args   : {}",new ObjectMapper().writeValueAsString(joinPoint.getArgs()));
    }

    @After("webLog()")
    public void doAfter(){
        // 结束后打个分隔线,方便查看
        logger.info("=========================================== End ===========================================");
    }

    @Around("webLog()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        //开始时间
        long startTime = System.currentTimeMillis();
        Object result = proceedingJoinPoint.proceed();
        // 打印出参
        logger.info("Response Args  : {}", new ObjectMapper().writeValueAsString(result));
        // 执行耗时
        logger.info("Time-Consuming : {} ms", System.currentTimeMillis() - startTime);
        return result;
    }
}

4、在controller方法上添加注解

public class testController{
    @Autowired
    private Test test;

    @PostMapping("/test")
    @WebLog()
    public ResponseVO test(@RequestBody TestPojo test){
        return test.test(test);
    }
}

类似这样

5、使用@Slf4j

在类上导入@Slf4j,然后使用log.info();去替代System.out.println();

6、最终参考效果

跑在ubuntu上的程序


控制台打印:
为你的项目配置日志(AOP+logback)_第1张图片


日志文件
为你的项目配置日志(AOP+logback)_第2张图片
为你的项目配置日志(AOP+logback)_第3张图片

成功记录!

你可能感兴趣的:(分享,logback,java,spring)