SpringBoot+Maven项目实战(6):整合Log4j和Aop,实现简单的日志记录

目录结构

这里写图片描述

pom.xml文件添加依赖

<!--log4j2-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- aop -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="com.sbm" level="trace" additivity="false">
            <AppenderRef ref="Console" />
        </Logger>
        <Root level="error">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

Aop记录Log类:AppLogAspect

package com.sbm.aspects;
import com.sbm.util.IPUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Enumeration;
/**
 * sbm
 * Created by yadong.zhang on com.sbm.aspects
 * User:yadong.zhang
 * Date:2016/10/21
 * Time:15:53
 */
@Component
@Aspect
/*
 * 定义切面执行的优先级,数字越低,优先级越高
 * 在切入点之前执行:按order值有小到大的顺序执行
 * 在切入点之后执行:按order值由大到小的顺序执行
 */
@Order(-5)
public class AppLogAspect {
    private Logger logger = LogManager.getLogger(AppLogAspect.class);
    // 保证每个线程都有一个单独的实例
    private ThreadLocal<Long> time = new ThreadLocal<>();
    @Pointcut("execution(* com.sbm.controller..*.*(..))")
    public void pointcut() {
    }
    @Before("pointcut()")
    public void doBefore(JoinPoint joinPoint) {
        time.set(System.currentTimeMillis());
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //记录请求的内容
        logger.info("Request URL: " + request.getRequestURL().toString());
        logger.info("Request Method: " + request.getMethod());
        logger.info("User-Agent: " + request.getHeader("User-Agent"));
        logger.info("Class Method: " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        logger.info("Cookies: " + request.getCookies());
        logger.info("Params: " + Arrays.toString(joinPoint.getArgs()));
        Enumeration<String> enums = request.getParameterNames();
        while (enums.hasMoreElements()) {
            String paraName = enums.nextElement();
            logger.info(paraName + ":" + request.getParameter(paraName));
        }
    }
    @AfterReturning("pointcut()")
    public void doAfterReturning(JoinPoint joinPoint) {
        logger.info("耗时 : " + ((System.currentTimeMillis() - time.get())) + "ms");
        logger.info("AppLogAspect.doAfterReturning()");
    }
}

简单的controller请求

@RequestMapping("/message/{currentPage}")
public String message(@PathVariable("currentPage") Integer currentPage, Model model){
    if(currentPage!= null){
        PageHelper.startPage(currentPage, 11);
    }
    LOGGER.debug("程序执行的时候输出Log日志...");
    List<Message> messages = messageService.list();
    model.addAttribute("messages", messages);
    return "message";
}

测试效果

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u011197448/article/details/53033430
今日推荐