文章目录

  • 1、概述
  • 1.1 说明
  • 1.2 日志体系
  • 1.2.1 JCL日志面门介绍
  • 1.2.2 Slf4j日志面门介绍
  • 2、几种日志系统介绍:
  • 2.1 Slf4j
  • 2.2 Commons-logging
  • 2.3 Log4j
  • 2.4 Logback
  • 3、日志整合
  • 3.1 Slf4j整合Log4j
  • 3.1.1 配置jar包依赖
  • 3.1.2 添加Log4j的配置文件
  • 3.2 Slf4集成Log4j2
  • 3.2.1 配置jar包依赖
  • 3.2.2 添加log4j2的配置文件
  • 3.3 Slf4集成Logback
  • 3.3.1 配置jar包依赖
  • 3.3.2 添加logback的配置文件


1、概述

1.1 说明

本文主要介绍了几种常见的日志框架 ,以及SpringMVC集成这几种框架的实例,

1.2 日志体系

现在市面上有commons-logging-xx.jar、log4j-xx.jar、sl4j-api-xx.jar等各种日志框架,为了有利于各个类的日志处理方式统一,聪明的程序员们想到了使用日志面门模式的日志框架,这种面向接口的开发框架有利于维护日志处理方式统一。简单来说,就是以前直接使用日志系统log4j、logback现在依赖使用日志框架Slf4j,这样这两种日志框架就可以在只改动相关配置的情况下进行自如切换。

1.2.1 JCL日志面门介绍

JCL就是Jakarta Commons Logging,这是一种日志面门模式的日志框架,JCL只提供Log接口,它的集成方案如下图所示:

springmvc 升级logback_java

1.2.2 Slf4j日志面门介绍

由于log4j的作者觉得jcl不好用,自己又写了一个新的接口api,那么就是slf4j。关于slf4j的集成图如下所示

springmvc 升级logback_学习_02

2、几种日志系统介绍:

2.1 Slf4j

slf4j即简单日志面门(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官网说法,slf4j是一个用于日志系统的Facade,用户可以在部署的应用中使用这种Facade支持的日志系统。
slf4j提供了统一的日志接口,可以在应用中灵活切换日志系统。

官方网站:http://www.slf4j.org/

2.2 Commons-logging

apache Commons logging就是Jakarta Commons Logging,是Apache下的一个开源项目。它提供的是一个日志接口(Interface),自身提供一个简单的日志 文件系统,但是一般和其他日志系统结合使用。例如:Commons-Loging + Log4j组合使用。它会通过动态查找机制,在程序运行时自动找到真正使用的日志库。springboot中就是comons-logging + logback方式作为日志实现

2.3 Log4j

log4j即是Log For Java,是Apache的一个开源项目,是一个灵活的日志框架,我们可以通过log4j的灵活配置日志的记录格式、记录级别、输出格式,而不需要动代码

2.4 Logback

logback是由log4j的创始人设计的又一个开源日志框架。
logback当前分为三个模块:logback-corelogback- classiclogback-access
logback-core是其它两个模块的基础模块。logback-classic是log4j的一个改良版本。logback-classic完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。

3、日志整合

3.1 Slf4j整合Log4j

3.1.1 配置jar包依赖

Slf4j整合Log4j需要导入jar包为:

  1. slf4j-api.jar
  2. slf4j-log4j12.jar
  3. log4j.jar

因此需要在pom中导入以下配置,本示例使用的slf4j-log4j12版本为:1.7.25

<!-- Slf4j的核心包,只有日志的接口,并没有实现 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j-log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j-log4j.version}</version>
        </dependency>
        <!-- log4j日志的具体实现 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!-- 桥接器,将JCL的日志输出重定向到Slf4j中 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${slf4j-log4j.version}</version>
            <scope>runtime</scope>
        </dependency>
        <!-- slf4j整合log4j结束 -->

其中jcl-over-slf4j是将Spring中使用的JCL日志输出重定向到Slf4j中,Spring中同时需要排除JCL的jar,配置如下所示:

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
            <exclusions>
                <!--Spring自身的日志系统是基于Commons-logging接口的,本系统采用的是
                    Slf4j+Log4j2的组合模式,为了避免冲突,因此需要将Sping中依赖排除
                -->
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

3.1.2 添加Log4j的配置文件

在resources目录下新建文件log4j.proerties(不要改名字)文件,并加入一下配置

# +======================================================================+#
log4j.rootLogger=${log4j.log.level},${log4j.log.target}
log4j.addivity.org.apache=true
# +======================================================================+#
# | [target] - Console - 控制台输出
# +----------------------------------------------------------------------+#
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=${log4j.log.level}
log4j.appender.CONSOLE.Encoding=${log4j.log.encoding}
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=${log4j.log.layout}
log4j.appender.CONSOLE.layout.ConversionPattern=${log4j.log.layout.pattern}
# +======================================================================+#
# | [target] - FILE - 文件输出
# +----------------------------------------------------------------------+#
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.Threshold=${log4j.log.level}
log4j.appender.FILE.Encoding=${log4j.log.encoding}
log4j.appender.FILE.File=${log4j.log.dir}/runtime.log
log4j.appender.FILE.Append=true
log4j.appender.FILE.MaxFileSize=2048KB
log4j.appender.FILE.MaxBackupIndex=10
log4j.appender.FILE.layout=${log4j.log.layout}
log4j.appender.FILE.layout.ConversionPattern=${log4j.log.layout.pattern}

# +======================================================================+#
# | log4j config - 日志级别配置
# +----------------------------------------------------------------------+#
log4j.log.dir=logs/
#log4j.log.level=ALL,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF
log4j.log.level=INFO
#log4j.log.target=CONSOLE,FILE,DATABASE,EMAIL,SOCKET
log4j.log.target=CONSOLE,FILE
log4j.log.encoding=UTF-8
log4j.log.layout=org.apache.log4j.PatternLayout
log4j.log.layout.pattern=[%d %r] [%-5p] [%t] [%l] [%m]%n
# +======================================================================+#

然后启动,项目测试:http://localhost:8080/springmvc/log/testLog1?username=leo825
日志输出如下所示:

[2020-02-09 23:20:56,111 36883] [INFO ] [http-apr-8080-exec-8] [com.leo.filter.MyFilter5.doFilter(MyFilter5.java:34)] [MyFilter5 执行过滤]
[2020-02-09 23:20:56,130 36902] [INFO ] [http-apr-8080-exec-8] [com.leo.filter.MyFilter5.doFilter(MyFilter5.java:37)] [MyFilter5 信息: [UserInfo{id=3, name='晓玲', gender='女', age='22', remarks='工程师'}, UserInfo{id=4, name='晓玲', gender='女', age='24', remarks='工程师'}]]
[2020-02-09 23:20:56,224 36996] [INFO ] [http-apr-8080-exec-8] [com.leo.controller.LoggerRecordController.testLog1(LoggerRecordController.java:38)] [[UserInfo{id=3, name='晓玲', gender='女', age='22', remarks='工程师'}, UserInfo{id=4, name='晓玲', gender='女', age='24', remarks='工程师'}]]
[2020-02-09 23:20:56,225 36997] [INFO ] [http-apr-8080-exec-8] [com.leo.controller.LoggerRecordController.testLog1(LoggerRecordController.java:41)] [获取name=leo825接口耗时:11ms]

3.2 Slf4集成Log4j2

3.2.1 配置jar包依赖

slf4j与log4j2整合导入的jar包为:

  1. slf4j-api.jar
  2. log4j-slf4j-impl.jar
  3. log4j-api.jar
  4. log4j-core.jar

因此需要在pom中导入以下配置,本示例配置 log4j2 需要的依赖:使用2.8.2版本

<!-- Slf4j的核心包,只有日志的接口,整合log4j2并没有实现 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j-log4j.version}</version>
        </dependency>
        <!-- 桥接器,将JCL的日志输出重定向到Slf4j中 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${slf4j-log4j.version}</version>
            <scope>runtime</scope>
        </dependency>
        <!-- 导入日志框架核心包与接口包 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j2.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>${log4j2.version}</version>
            <scope>runtime</scope>
        </dependency>
        <!--用于slf4j与log4j2保持桥接 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>${log4j2.version}</version>
            <scope>runtime</scope>
        </dependency>
        <!--用于解决web环境下关闭服务器时可能出现的log4j线程无法及时关闭的warn,web工程需要包含log4j-web,非web工程不需要 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-web</artifactId>
            <version>${log4j2.version}</version>
            <scope>runtime</scope>
        </dependency>
        <!--使用log4j2的AsyncLogger时需要包含disruptor -->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <scope>runtime</scope>
            <version>3.4.2</version>
        </dependency>
        <!-- slf4j整合log4j2结束 -->

3.2.2 添加log4j2的配置文件

其中所注入的jar包上已经写了相应的注释,然后在resources目录下增加log4j2.xml(不要改名字)配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!--
    status:这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出。
    monitorInterval : Log4j2能够自动检测修改配置文件和重新配置本身,设置间隔秒数,单位是s,最小是5s.
-->
<Configuration status="ERROR" monitorInterval="30">
    <Properties>
        <!-- 配置日志文件输出目录 -->
        <Property name="LOG_HOME">/root/bubble/logs</Property>
        <property name="ERROR_LOG_FILE_NAME">/root/bubble/logs</property>
    </Properties>
    <Appenders>
        <!-- Console节点 配置控制台日志输出:
            name:指定Appender的名字.
            target: SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT.
            PatternLayout: 输出格式,不设置默认为:%m%n.
        -->
        <Console name="Console" target="SYSTEM_OUT">
            <!-- ThresholdFilter 过滤器:
                控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)
                日志的级别: ALL< Trace < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
            -->
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" />
            <!-- PatternLayout 日志输出格式模板:
                %d{yyyy-MM-dd HH:mm:ss.SSS} 日志生成时间。
                %-5level 日志级别(级别从左显示5个字符宽度)。
                %logger{36} 表示logger名字最长36个字符,否则按照句点分割。
                %L 日志输出所在行数 日志输出所在行数
                [%t] 输出产生该日志事件的线程名
                %msg 日志消息
                %n 是换行符
                eg:"2017-04-17 16:04:02.312 INFO  com.zte.lucene.tools.DateUtils2Joda:424 [main] - Info Message!"
            -->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36}:%L [%t] - %msg%n" />
        </Console>
        <!-- RollingFileAppender 定义输出滚动文件格式。(FileAppender 定义输出到文件)
            name : RollingFileAppender的名字,用于与Loggers模块的绑定
            fileName : 日志输出保存的文件路径
            filePattern:满足条件后,日志输出保存的文件路径和名称。
            (eg: 2017-04/search-2017-04-17-1.log)
        -->
        <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/search.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/search-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" />
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36}:%L [%t] - %msg%n" />
            <!-- Policies定义相关策略:-->
            <Policies>
                <!--TimeBasedTriggeringPolicy 基于时间的滚动策略:该策略主要是完成周期性的log文件封存工作。
                    interval: integer型,指定两次封存动作之间的时间间隔,默认是1 hour。
                        单位:以日志的命名精度来确定单位,比如yyyy-MM-dd-HH 单位为小时,yyyy-MM-dd-HH-mm 单位为分钟。
                        关键点在于 filePattern后的日期格式.
                    modulate: boolean型,说明是否对封存时间进行调制。
                        若modulate=true,则封存时间将以0点为边界进行偏移计算。
                        比如:modulate=true,interval=4hours,那么假设上次封存日志的时间为01:00,
                        则下次封存日志的时间为04:00,之后的封存时间依次为08:00,12:00.
                -->
                <!-- log4j2的按天分日志文件 : search-%d{yyyy-MM-dd}.log -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <!--SizeBasedTriggeringPolicy 基于对log文件大小的判断策略:
                    当log文件大于设定的阈值时,将触发封存动作。
                    可设定的log文件大小的单位有bytes、KB、MB或GB。
                -->
                <SizeBasedTriggeringPolicy size="100 MB" />
            </Policies>
            <!--DefaultRolloverStrategy(属性如不设置,则默认为最多同一文件夹下7个文件):
                fileIndex: String类型,有两个选择“max”或“min”。
                    设置为“max”意味着将最新的日志信息封存在序号较大的封存文件中。“min”则相反。
                max: integer类型,封存文件的序号的最大值。(超过最大值时,将有文件被删除)
                min: integer类型,封存文件的序号的起始值。
            相当于min和max两个参数设置了一个保存窗口,超出这个窗口的日志文件将会被删除。
            -->
            <DefaultRolloverStrategy max="100" />
        </RollingFile>
        <RollingFile name="RollingFileError"
                     fileName="${ERROR_LOG_FILE_NAME}/search-error.log"
                     filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/search-error-%d{yyyy-MM-dd}.log">
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36}:%L [%t] - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
            <DefaultRolloverStrategy max="100" />
        </RollingFile>
    </Appenders>
    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <Loggers>
        <!--过滤掉spring的一些无用的DEBUG信息-->
        <logger name="org.springframework" level="INFO"></logger>
        <!-- 配置日志的根节点 -->
        <!-- level="all" 只能够输出level级别是all及all以上的-->
        <root level="all">
            <appender-ref ref="Console" />
            <appender-ref ref="RollingFileInfo" />
            <appender-ref ref="RollingFileError" />
        </root>
    </Loggers>
</Configuration>

然后需要在web.xml中增加上下文,将文件配置进去

<!-- 集成log4j2日志框架 -->
    <context-param>
        <param-name>log4jConfiguration</param-name>
        <param-value>classpath:log4j2.xml</param-value>
    </context-param>

最后测试:http://localhost:8080/springmvc/log/testLog1?username=leo825

2020-02-10 00:18:40.527 INFO  com.leo.filter.MyFilter5:34 [http-apr-8080-exec-8] - MyFilter5 执行过滤
2020-02-10 00:18:40.542 INFO  com.leo.filter.MyFilter5:37 [http-apr-8080-exec-8] - MyFilter5 信息: [UserInfo{id=3, name='晓玲', gender='女', age='22', remarks='工程师'}, UserInfo{id=4, name='晓玲', gender='女', age='24', remarks='工程师'}]
2020-02-10 00:18:40.652 INFO  com.leo.controller.LoggerRecordController:38 [http-apr-8080-exec-8] - [UserInfo{id=3, name='晓玲', gender='女', age='22', remarks='工程师'}, UserInfo{id=4, name='晓玲', gender='女', age='24', remarks='工程师'}]
2020-02-10 00:18:40.653 INFO  com.leo.controller.LoggerRecordController:41 [http-apr-8080-exec-8] - 获取name=leo825接口耗时:12ms

3.3 Slf4集成Logback

slf4j与logback整合导入的jar包为:

  1. slf4j-api.jar
  2. logback-core.jar
  3. logback-classic.jar

3.3.1 配置jar包依赖

依赖的jar可以参考如下pom中配置:

<!-- Slf4j的核心包,只有日志的接口,没有实现层。整合logback -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j-log4j.version}</version>
        </dependency>
        <!-- 桥接器,将JCL的日志输出重定向到Slf4j中,Sping中排除了JCL依赖 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${slf4j-log4j.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>${logback.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
        </dependency>
        <!-- 为了将logback和spring集成而使用的包,如果不用这个包也可以记录日志,但会有个问题 -->
        <dependency>
            <groupId>org.logback-extensions</groupId>
            <artifactId>logback-ext-spring</artifactId>
            <version>0.1.5</version>
        </dependency>
        <!-- slf4j整合logback结束 -->

3.3.2 添加logback的配置文件

logback的配置文件有很多,也可以参考如下配置

<?xml version="1.0" encoding="UTF-8"?>
<!--
	说明:
	1、日志级别及文件
		日志记录采用分级记录,级别与日志文件名相对应,不同级别的日志信息记录到不同的日志文件中
		例如:error级别记录到log.error.xxx.log或log.error.log(该文件为当前记录的日志文件),而log.error.xxx.log为归档日志,
		日志文件按日期记录,同一天内,若日志文件大小等于或大于10M,则按0、1、2...顺序分别命名
		例如log-level-2013-12-21.0.log
		其它级别的日志也是如此。

	2、文件路径
		若开发、测试用,在Eclipse中运行项目,则到Eclipse的安装路径查找logs文件夹.
		若部署到Tomcat下,则在Tomcat下的logs文件中.
		${catalina.base}能够取到项目部署时候的tomcat目录。

	3、Appender
		FILE-ERROR对应error级别,文件名以log.error.xxx.log形式命名
		FILE-WARN对应warn级别,文件名以log.warn.xxx.log形式命名
		FILE-INFO对应info级别,文件名以log.info.xxx.log形式命名
		FILE-DEBUG对应debug级别,文件名以log.debug.xxx.log形式命名
		STDOUT将日志信息输出到控制台上,为方便开发测试使用
 -->

<!--
    scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true.
    scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒.当scan为true时,此属性生效。默认的时间间隔为1分钟.
    debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <!-- 在Eclipse中运行,请到Eclipse的安装目录中找log文件,Tomcat下,请到Tomcat目录下找 -->
    <property name="LOG_PATH" value="${catalina.base}/logs"/>
    <!-- 项目名称 -->
    <property name="PROJECT_NAME" value="spring-starter"/>


    <!-- 控制台打印日志的配置 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %level ${PROJECT_NAME} [%thread] [%logger{50}:%line] %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
    </appender>


    <!-- 配置DEBUG, INFO, WARN, ERROR 日志的Appender -->
    <appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${LOG_PATH}/${PROJECT_NAME}/${PROJECT_NAME}.log.error.log</file>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,
                 可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
                 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${PROJECT_NAME}/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日志记录之外,还配置了日志文件不能超过10M,若超过10M,日志文件会以索引0开始,
                 命名日志文件,例如log-error-2013-12-21.0.log -->
            <maxFileSize>10MB</maxFileSize>
            <!-- 日志文件保留天数 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 追加方式记录日志 -->
        <append>true</append>
        <!-- 日志打印的格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %level ${PROJECT_NAME} [%thread] [%logger{50}:%line] %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日志文件只记录error级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="FILE-WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${LOG_PATH}/${PROJECT_NAME}/${PROJECT_NAME}.log.warn.log</file>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,
                 可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
                 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${PROJECT_NAME}/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日志记录之外,还配置了日志文件不能超过10M,若超过10M,日志文件会以索引0开始,
                 命名日志文件,例如log-warn-2013-12-21.0.log -->
            <maxFileSize>10MB</maxFileSize>
            <!-- 日志文件保留天数 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 追加方式记录日志 -->
        <append>true</append>
        <!-- 日志打印的格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %level ${PROJECT_NAME} [%thread] [%logger{50}:%line] %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日志文件只记录warn级别,不记录大于warn级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${LOG_PATH}/${PROJECT_NAME}/${PROJECT_NAME}.log.info.log</file>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,
                 可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
                 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${PROJECT_NAME}/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日志记录之外,还配置了日志文件不能超过10M,若超过10M,日志文件会以索引0开始,
                 命名日志文件,例如log-info-2013-12-21.0.log -->
            <maxFileSize>10MB</maxFileSize>
            <!-- 日志文件保留天数 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 追加方式记录日志 -->
        <append>true</append>
        <!-- 日志打印的格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %level ${PROJECT_NAME} [%thread] [%logger{50}:%line] %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日志文件只记录info级别,不记录大于info级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="FILE-DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${LOG_PATH}/${PROJECT_NAME}/${PROJECT_NAME}.log.debug.log</file>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,
                 可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
                 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${PROJECT_NAME}/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日志记录之外,还配置了日志文件不能超过10M,若超过10M,日志文件会以索引0开始,
                 命名日志文件,例如log-debug-2013-12-21.0.log -->
            <maxFileSize>10MB</maxFileSize>
            <!-- 日志文件保留天数 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 追加方式记录日志 -->
        <append>true</append>
        <!-- 日志打印的格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %level ${PROJECT_NAME} [%thread] [%logger{50}:%line] %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日志文件只记录debug级别,不记录大于debug级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    
    <!-- SPRING等框架类代码日志打印, 输出到OTHER文件中, 出厂默认WARN以上 -->
    <appender name="OTHER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 此日志文件只记录warn级别及其以上的 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
        <!-- 正在记录的日志文件的路径及文件名 -->
        <File>${LOG_PATH}/${PROJECT_NAME}/${PROJECT_NAME}.log.other.log</File>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,
                 可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
                 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${PROJECT_NAME}/log-other-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日志记录之外,还配置了日志文件不能超过10M,若超过10M,日志文件会以索引0开始,
                 命名日志文件,例如log-debug-2013-12-21.0.log -->
            <maxFileSize>35MB</maxFileSize>
            <!-- 日志文件保留天数 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 追加方式记录日志 -->
        <append>true</append>
        <!-- 日志打印的格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %level ${PROJECT_NAME} [%thread] [%logger{50}:%line] %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
    </appender>


    <!--
        出厂默认输出level级别INFO, 排查问题时, 可以通过工具切换为TRACE.
        自定义模块日志打印 添加在后面.
        name需要修改为自己项目中的合适的package
     -->
    <logger name="com.leo" level="INFO" additivity="false">
        <appender-ref ref="FILE-ERROR" />
        <appender-ref ref="FILE-WARN" />
        <appender-ref ref="FILE-INFO" />
        <appender-ref ref="FILE-DEBUG" />
        <!-- 生产环境请将STDOUT去掉!!! -->
        <appender-ref ref="STDOUT" />
    </logger>


    <!-- 其他的warn级别及其以上的日志,通过OTHER来记录 -->
    <root level="WARN">
        <appender-ref ref="OTHER" />
    </root>

</configuration>

然后,就是将配置文件配置到web.xml中

<!-- 集成logback日志框架 -->
    <context-param>
        <param-name>logbackConfiguration</param-name>
        <param-value>classpath:logback.xml</param-value>
    </context-param>
    <listener>
        <listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
    </listener>
    <!-- 集成logback日志框架end -->

最后测试一下:http://localhost:8080/springmvc/log/testLog1?username=leo825

2020-02-10 11:01:08.777 INFO spring-starter [http-apr-8080-exec-8] [com.leo.filter.MyFilter5:34] MyFilter5 执行过滤
2020-02-10 11:01:08.793 INFO spring-starter [http-apr-8080-exec-8] [com.leo.filter.MyFilter5:37] MyFilter5 信息: [UserInfo{id=3, name='晓玲', gender='女', age='22', remarks='工程师'}, UserInfo{id=4, name='晓玲', gender='女', age='24', remarks='工程师'}]
2020-02-10 11:01:08.901 INFO spring-starter [http-apr-8080-exec-8] [com.leo.controller.LoggerRecordController:38] [UserInfo{id=3, name='晓玲', gender='女', age='22', remarks='工程师'}, UserInfo{id=4, name='晓玲', gender='女', age='24', remarks='工程师'}]
2020-02-10 11:01:08.902 INFO spring-starter [http-apr-8080-exec-8] [com.leo.controller.LoggerRecordController:41] 获取name=leo825接口耗时:9ms