【Log4j2简介】

首先log4j2,2指的是1.x的升级版。

它参考了logback的一些优秀设计,主要有:

1、异常处理:log4j2提供了一些异常处理机制

2、自动重载配置:参考logback设计,提供自动刷新参数配置,可以动态修改日志的级别而不需要重启应用。

3、无垃圾机制,避免频繁的日志收集。

【Idea添加Log4j2依赖】

<!--添加log4j2相关jar包-->    
   <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-api</artifactId>
       <version>2.7</version>
   </dependency>
   <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-core</artifactId>
       <version>2.7</version>
   </dependency>

resources

配置文件可以直接在resources文件夹下创建,文件名为log4j2.xml,log4j2的相关组件会自动扫描log4j2.xml或log4j2.properties

xml.jpg

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
   <!--先定义所有的appender -->
   <appenders>
       <!--这个输出控制台的配置 -->
       <Console name="Console" target="SYSTEM_OUT">
           <!--             控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
           <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
           <!--             这个都知道是输出日志的格式 -->
           <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
       </Console>

       <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 -->
       <!--append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true -->
       <File name="log" fileName="D:/logs/log4j2.log" append="false">
           <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
       </File>

       <!--添加过滤器ThresholdFilter,可以有选择的输出某个级别以上的类别  onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,否则直接拒绝  -->
       <File name="ERROR" fileName="D:/logs/error.log">
           <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
           <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
       </File>

       <!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
       <RollingFile name="RollingFile" fileName="D:/logs/web.log"
                    filePattern="logs/$${date:yyyy-MM}/web-%d{MM-dd-yyyy}-%i.log.gz">
           <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
           <SizeBasedTriggeringPolicy size="2MB"/>
       </RollingFile>
   </appenders>
   <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
   <loggers>
       <root level="trace">
           <appender-ref ref="RollingFile"/>
           <appender-ref ref="Console"/>
           <appender-ref ref="ERROR" />
           <appender-ref ref="log"/>
       </root>
   </loggers>
</configuration>

【测试demo】

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping
("/redant")
public class Wcl {
   private static Logger logger= LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);

   public static void main(String[] args) {
       for (int i = 0; i < 1000; i++) {
            // 记录trace级别的信息
           
logger.trace("log4j2日志出:This is trace message.");
            // 记录debug级别的信息
           
logger.debug("log4j2日志出:This is debug message.");
            // 记录info级别的信息
           
logger.info("log4j2日志出:This is info message.");
            // 记录error级别的信息
           
logger.error("log4j2日志出:This is error message.");
       }
   }
}

【演示】

111.jpg

3.jpg

【LogBack简介】

logback是由log4j创始人设计的又一个开源日志组件。

分为三个模块:logback-core基础、classic改良、access访问模块与servlet容器集成提供通过http来访问日志的功能。

【lombok配置】

Spring Boot的启动与调用咱们已经讲过,这里不再赘述。

【logback依赖】

    <!--logback 日志处理-->

        <dependency>

            <groupId>ch.qos.logback</groupId>

            <artifactId>logback-classic</artifactId>

            <version>1.2.3</version>

        </dependency>

        <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->

        <dependency>

            <groupId>ch.qos.logback</groupId>

            <artifactId>logback-core</artifactId>

            <version>1.2.3</version>

        </dependency>

        <!-- https://mvnrepository.com/artifact/org.logback-extensions/logback-ext-spring -->

        <dependency>

            <groupId>org.logback-extensions</groupId>

            <artifactId>logback-ext-spring</artifactId>

            <version>0.1.4</version>

        </dependency>

    </dependencies>

 【logback.xml配置文件】

同样,我们在resources的根目录下创建logback.xml。原理同上面所提到的,不再赘述。

 <?xml version="1.0" encoding="UTF-8"?>
<!-- 从高到地低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
<!-- 日志输出规则  根据当前ROOT 级别,日志输出时,级别高于root默认的级别时  会输出 -->
<!-- 以下  每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志-->
<!-- 属性描述 scan:性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" debug="false">
    <!-- 自定义定义日志文件 输入位置 可以更改位置 -->
    <property name="path" value="D:/logs/logback"/>
    <!--%highlight() 颜色打印 不同级别日志打印不同颜色-->
    <property name="CONSOLE_LOG_PATTERN" value="%highlight(%d{yyyy-MM-dd HH:mm:ss.SSS}  %-5level [%thread] [line%4line] %logger{50} : %msg %n)"/>
    <!--info级别日志文件配置-->
    <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [line%4line] %logger{50} : %msg%n</pattern>
            <charset>UTF-8</charset>
            <!-- 此处设置字符集,防止中文乱码 -->
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${path}/info/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 最大64MB 超过最大值,会重新建一个文件。因为查看日志的时候,太大的文件不好排查
                而且容易打不开。太小又太碎。-->
                <maxFileSize>64 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <!--如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。-->
        <prudent>false</prudent>
    </appender>
    <!--警告文件配置-->
    <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [line%4line] %logger{50} : %msg%n</pattern>
            <charset>UTF-8</charset>
            <!-- 此处设置字符集,防止中文乱码 -->
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${path}/warn/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 最大64MB 超过最大值,会重新建一个文件-->
                <maxFileSize>64 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
        <!--如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。-->
        <prudent>false</prudent>
    </appender>
    <!--错误日志配置-->
    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 文件输出的日志 的格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [line%4line] %logger{50} : %msg%n</pattern>
            <charset>UTF-8</charset>
            <!-- 此处设置字符集,防止中文乱码 -->
        </encoder>
        <!-- 配置日志所生成的目录以及生成文件名的规则 在logs/mylog-2016-10-31.0.log -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${path}/error/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 最大64MB 超过最大值,会重新建一个文件-->
                <maxFileSize>64 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <!--如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。-->
        <prudent>false</prudent>
    </appender>
    <!--debug配置-->
    <appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 文件输出的日志 的格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [line%4line] %logger{50} : %msg%n</pattern>
            <charset>UTF-8</charset>
            <!-- 此处设置字符集,防止中文乱码 -->
        </encoder>
        <!-- 配置日志所生成的目录以及生成文件名的规则 在logs/mylog-2016-10-31.0.log -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${path}/debug/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 最大64MB 超过最大值,会重新建一个文件-->
                <maxFileSize>64 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
        <!--如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。-->
        <prudent>false</prudent>
    </appender>
    <!--控制台输出的格式设置 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 控制台输出的日志 的格式 -->
        <encoder>
            <pattern>
                ${CONSOLE_LOG_PATTERN}
            </pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 只是DEBUG级别以上的日志才显示 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
    </appender>
    <!-- root级别 (name = dao 实现SQL打印并写入日志文件,与mybatis-config.xml中的dao.对应)  DEBUG -->
    <root name="dao" level="DEBUG">
        <!-- 控制台输出 -->
        <appender-ref ref="STDOUT"/>
        <!-- 文件输出 表示开启对应的日志级别 -->
        <appender-ref ref="FILE_WARN"/>
        <appender-ref ref="FILE_INFO"/>
        <appender-ref ref="FILE_ERROR"/>
        <appender-ref ref="FILE_DEBUG"/>
    </root>
</configuration>

【logback测试demo】

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Logback {
   static Logger logger = LoggerFactory.getLogger(Logback.class);

   public static void main(String[] args) {
       for (int i = 0; i < 1000; i++) {
           logger.debug("这是一个  debug"+i);
           logger.info("这是一个  info"+i);
           logger.error("这是一个 error"+i);
           logger.warn("这是一个 warn"+i);
       }
   }

}

logback.jpg

搜狗截图20200402112131.jpg