springboot 集成Log4j2

一、Log4j2的介绍

Log4j是Apache下的一开源项目,通过使用Log4j可以将日志信息打印到控制台、文件等。我们也可以控制每一条日志的输出格式,通过定义每一条日志信息的级别能够更加细致地控制日志的生成过程。

在应用程序中添加日志记录有三个目的:

1、监视代码中变量的变化,周期性地记录到文件中,供其他应用进行统计分析

2、跟踪代码运行时的轨迹,作为日后审计的依据

3、担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息

Log4j2的三个重要组成部分:

  1. Loggers(记录器):Loggers组件被分为7个级别:all、debug、info、warn、error、fatal、off。这7个级别是有优先级的:all< debug < info < warn < error < fatal < off    Log4J只输出级别不低于设定级别的日志输出
  2. Appends(输出源):Log4j允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等。
  3. Layout(布局):Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息

 

二、集成Log4j2

Log4j2支持两种配置方式,xml格式的文件和properties文件。下面我们用xml来配置,xml可以配置更多的功能

第一步、引入依赖

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

第二步、springboot默认使用Logback日志框架来记录日志,并用INFO级别输出到控制台,所以我们要先排除它的依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                     <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

 第三步、添加Log4j的配置文件

   1、根节点Configuration有两个属性:statusmonitorinterval,有两个子节点:AppendersLoggers(表明可以定义多个 AppenderLogger):

  • status用来指定log4j本身的打印日志的级别。
  • monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s

 

 2、Appenders节点,常见的有三种子节点:ConsoleRollingFileFile

  • Console节点用来定义输出到控制台的Appender
     name:指定 Appender 的名字
       targetSYSTEM_OUTSYSTEM_ERR,一般只设置默认:SYSTEM_OUT
       PatternLayout:输出格式,不设置默认为%m%n
  • File节点用来定义输出到指定位置的文件的Appender
      name:指定Appender的名字
      fileName:指定输出日志的目的文件带全路径的文件名
      PatternLayout:输出格式,不设置默认为%m%n
  • RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender
    name:指定Appender的名字
    fileName:指定输出日志的目的文件带全路径的文件名
    PatternLayout:输出格式,不设置默认为%m%n
    filePattern:指定新建日志文件的名称格式
    Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志
    TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hourmodulate=true用来调整时间:比如现在是早上3aminterval是4,那么第一次滚动是在4am,接着是8am12am...而不是7am
    SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size 属性用来定义每个日志文件的大小.
    DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。

3、Loggers节点,常见的有两种RootLogger

  • root节点用来指定项目的根日志,如果没有单独指定 Logger,那么就会默认使用该 Root日志输出

  level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF
  AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender

  • logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。

  level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF
  name:用来指定该 Logger所适用的类或者类所在的包全路径,继承自 Root节点.
  AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自 Root。如果指定了,那么会在指定的这个AppenderRootAppender中都会输出,此时我们可以设置 Loggeradditivity="false"只在自定义的 Appender中进行输出。

 

关于日志 level
共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF

  • All:最低等级的,用于打开所有日志记录.
  • Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出.
  • Debug:指出细粒度信息事件对调试应用程序是非常有帮助的.
  • Info:消息在粗粒度级别上突出强调应用程序的运行过程.
  • Warn:输出警告及warn以下级别的日志.
  • Error:输出错误信息日志.
  • Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志.
  • OFF:最高等级的,用于关闭所有日志记录.
    程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
 <!--  %d{HH:mm:ss.SSS}  毫秒的时间

        %p代表输出该条日志的等级

        %t  当前线程名称

        %-5level  日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0

        %c{1}  类名

        %L 输出行号

        %msg 日志文本

        %n 换行

   其他常用的占位符有:
        %F 输出所在的类文件名,如Client.java

        %M 输出所在方法名

        %m是输出代码指定的日志信息

        %l  输出语句所在的行数, 包括类名、方法名、文件名、行数 (这个比较强大)  -->
<configuration status="WARN" monitorInterval="30">
    <!--先定义所有的appender-->
    <appenders>
        <!--这个输出控制台的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%t] - %l - %m%n"/>
        </console>

        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
        <File name="log" fileName="E:/log/test.log" append="false">
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%t] - %l - %m%n"/>
        </File>

        <!--INFO日志文件输出 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileInfo" fileName="E:/logs/info.log"
                     filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
        <!-- Warn日志文件输出 -->
        <RollingFile name="RollingFileWarn" fileName="E:/logs/warn.log"
                     filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
        <!-- Error日志文件输出 -->
        <!--<RollingFile name="RollingFileError" fileName="E:/logs/error.log"-->
                     <!--filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">-->
            <!--<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>-->
            <!--<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>-->
            <!--<Policies>-->
                <!--<TimeBasedTriggeringPolicy/>-->
                <!--<SizeBasedTriggeringPolicy size="100 MB"/>-->
            <!--</Policies>-->
        <!--</RollingFile>-->
    </appenders>

    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <!--节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等-->
        <!--<logger name="org.springframework" level="INFO"></logger>-->
        <!--<logger name="org.mybatis" level="INFO"></logger>-->
        <root level="INFO">
            <appender-ref ref="Console"/>
            <appender-ref ref="log"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <!--<appender-ref ref="RollingFileError"/>-->
        </root>
    </loggers>
</configuration>

并在application.properties文件中添加配置 


#log4j配置--------------------------
logging.config=classpath:log4j2.xml

第四步、运行项目、测试日志

我们启动项目,看日志有没有被记录,我们可以看出控制台输出了日志

日志以文件的形式被记录了起来 

 

三、测试我们自己写的类,并记录到日志

我们在需要进行日志记录的类中,引入日志管理器LogManager,在需要记录日志的方法里面,写入相应的代码

package com.example.common.filter;


import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * AyUser过滤器
 * 通过注解的方式自动注册filter
 */

@WebFilter(filterName = "ayUserFilter", urlPatterns = "/*")
public class AyUserFilter implements Filter {
    private Logger myLogger = LogManager.getLogger(this.getClass());

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        myLogger.info("----------------->>> ayUserFilter init" );
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        myLogger.info("----------------->>> ayUserFilter doFilter" );
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        myLogger.info("----------------->>> ayUserFilter destroy" );
    }
}

我们可以看到,日志被输出到了控制台,同时也输出到了刚才设置路径的文件里面

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值