一个项目不能缺少的就是 日志 功能,有了日志功能不仅方便我们调试应用,而且日后寻找问题也会更加方便. 首先
    添加依赖文件

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. ....
    3. <properties>
    4. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    5. <maven.compiler.source>1.7</maven.compiler.source>
    6. <maven.compiler.target>1.7</maven.compiler.target>
    7. <tomcat.version>9.0.39</tomcat.version>
    8. <logback.version>1.3.0-alpha5</logback.version>
    9. </properties>
    10. <dependencies>
    11. <!-- 内嵌Tomcat -->
    12. ...
    13. <!-- logback -->
    14. <dependency>
    15. <groupId>ch.qos.logback</groupId>
    16. <artifactId>logback-core</artifactId>
    17. <version>${logback.version}</version>
    18. </dependency>
    19. <dependency>
    20. <groupId>ch.qos.logback</groupId>
    21. <artifactId>logback-classic</artifactId>
    22. <version>${logback.version}</version>
    23. </dependency>
    24. </dependencies>
    25. <build>
    26. ...
    27. </build>
    28. </project>

    新建 logback.xml 配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- scan属性是true时,如果配置文档发生改变将会进行重新加载 -->
    <!-- scanPeriod属性设置监测配置文件修改的时间间隔,默认单位为毫秒,在scan为true时才生效 -->
    <!-- debug属性如果为true时,会打印出logback内部的日志信息 -->
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
        <!-- 定义参数常量 -->
        <!-- 日志级别:TRACE<DEBUG<INFO<WARN<ERROR,其中常用的是DEBUG、INFO和ERROR -->
        <property name="log.level" value="debug" />
        <!-- 文件保留时间 -->
        <property name="log.maxHistory" value="30" />
        <!-- 日志存储路径 -->
        <property name="log.filePath" value="logs/" />
        <!-- 日志的显式格式 -->
        <property name="log.pattern"
                  value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n"></property>
        <!-- 用于说明输出介质,此处说明控制台输出 -->
        <appender name="consoleAppender"
                  class="ch.qos.logback.core.ConsoleAppender">
            <!-- 类似于layout,除了将时间转化为数组,还会将转换后的数组输出到相应的文件中 -->
            <encoder>
                <!-- 定义日志的输出格式 -->
                <pattern>${log.pattern}</pattern>
            </encoder>
        </appender>
        <!-- DEBUG,表示文件随着时间的推移按时间生成日志文件 -->
        <appender name="debugAppender"
                  class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 文件路径 -->
            <file>${log.filePath}/debug.log</file>
            <!-- 滚动策略 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 设置文件名称 -->
                <fileNamePattern>
                    ${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz
                </fileNamePattern>
                <!-- 设置最大保存周期 -->
                <MaxHistory>${log.maxHistory}</MaxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>${log.pattern}</pattern>
            </encoder>
            <!-- 过滤器,过滤掉不是指定日志水平的日志 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <!-- 设置日志级别 -->
                <level>DEBUG</level>
                <!-- 如果跟该日志水平相匹配,则接受 -->
                <onMatch>ACCEPT</onMatch>
                <!-- 如果跟该日志水平不匹配,则过滤掉 -->
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
        <!-- INFO,表示文件随着时间的推移按时间生成日志文件 -->
        <appender name="infoAppender"
                  class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 文件路径 -->
            <file>${log.filePath}/info.log</file>
            <!-- 滚动策略 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 设置文件名称 -->
                <fileNamePattern>
                    ${log.filePath}/info/info.%d{yyyy-MM-dd}.log.gz
                </fileNamePattern>
                <!-- 设置最大保存周期 -->
                <MaxHistory>${log.maxHistory}</MaxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>${log.pattern}</pattern>
            </encoder>
            <!-- 过滤器,过滤掉不是指定日志水平的日志 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <!-- 设置日志级别 -->
                <level>INFO</level>
                <!-- 如果跟该日志水平相匹配,则接受 -->
                <onMatch>ACCEPT</onMatch>
                <!-- 如果跟该日志水平不匹配,则过滤掉 -->
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
        <!-- ERROR,表示文件随着时间的推移按时间生成日志文件 -->
        <appender name="errorAppender"
                  class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 文件路径 -->
            <file>${log.filePath}/error.log</file>
            <!-- 滚动策略 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 设置文件名称 -->
                <fileNamePattern>
                    ${log.filePath}/error/error.%d{yyyy-MM-dd}.log.gz
                </fileNamePattern>
                <!-- 设置最大保存周期 -->
                <MaxHistory>${log.maxHistory}</MaxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>${log.pattern}</pattern>
            </encoder>
            <!-- 过滤器,过滤掉不是指定日志水平的日志 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <!-- 设置日志级别 -->
                <level>ERROR</level>
                <!-- 如果跟该日志水平相匹配,则接受 -->
                <onMatch>ACCEPT</onMatch>
                <!-- 如果跟该日志水平不匹配,则过滤掉 -->
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
        <!-- 用于存放日志对象,同时指定关联的package位置 -->
        <!-- name指定关联的package -->
        <!-- level表明指记录哪个日志级别以上的日志 -->
        <!-- appender-ref指定logger向哪个文件输出日志信息 -->
        <!-- additivity为true时,logger会把根logger的日志输出地址加入进来,但logger水平不依赖于根logger -->
        <logger name="com.example" level="${log.level}" additivity="true">
            <appender-ref ref="debugAppender" />
            <appender-ref ref="infoAppender" />
            <appender-ref ref="errorAppender" />
        </logger>
        <!-- 特殊的logger,根logger -->
        <root lever="info">
            <!-- 指定默认的日志输出 -->
            <appender-ref ref="consoleAppender" />
            <appender-ref ref="errorAppender" />
        </root>
    </configuration>