SpringBoot 集成Log4j、集成AOP

 

集成Log4j

(1)在pom.xml中添加依赖

        <!--去掉springboot默认的日志-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
        </dependency>

        <!--log4j的依赖-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

springboot默认使用自带的日志,需要先去掉自带的spring-boot-starter-logging,我们引入的log4j才会起作用。

 

 

(2)在resources下新建log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout,D


# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE


# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.Threshold = DEBUG
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n


# File output...
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
#相对路径,相对于tomcat的根目录。
#log4j.appender.D.File = ../logs/error.log
log4j.appender.D.File = D:/logs/error.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
log4j.appender.D.encoding=UTF-8

springboot官方推荐日志配置的文件名以-spring结尾,log4j-spring.properties。当然,使用log4j.properties也行。

 

至此已经集成log4j,springboot会自动使用log4j来管理日志。

 

 

 

我们可以手动输出日志:

        Logger logger = Logger.getLogger(UserController.class);  //传入当前类的class对象
        logger.debug("This is debug message.");
        logger.error("This is error message.");
  

Logger一般写成成员变量的形式,方便在此类的所有方法中使用:

private Logger logger = Logger.getLogger(UserController.class);

 

注意导入的Logger是:

import org.apache.log4j.Logger;

不要导错了。

 

如果需要统一记录日志,比如记录每个请求的请求参数、ip,在每个controller中都写Logger,很麻烦,这就需要使用AOP拦截每个请求。

 

 


 

 

集成AOP

(1)pom.xml中引入依赖

        <!--aop的起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

 

 

(2)新建包com.chy.aspect,包下新建切面RequestLogAspect

@Aspect
@Component
public class RequestLogAspect {
    //Logger对象
    private Logger logger=Logger.getLogger(RequestLogAspect.class);

    //定义切入点,拦截所有controller
    @Pointcut("execution(public * com.chy.controller.*.*(..)))")
    public void allController(){};

    //前增强,()中是切入点
    @Before("allController()")
    public void requestLog(){
        //获取request对象
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        //请求地址、请求方法、ip
        logger.info("url:"+request.getRequestURI());
        logger.info("http_method:"+request.getMethod());
        logger.info("ip:"+request.getRemoteAddr());

        //遍历请求参数
        Enumeration<String> paramNames = request.getParameterNames();
        while (paramNames.hasMoreElements()){
            String paramName = paramNames.nextElement();
            String paramVal = request.getParameter(paramName);
            logger.info(paramName+":"+paramVal);
        }
    }

}

注意调用的logger中的方法、log4j.properties中设置的文件输出等级,等级不够是不会输出到文件的。

 

posted @ 2020-02-09 15:26  chy_18883701161  阅读(688)  评论(0编辑  收藏  举报