常见的日志记录工具

  1. Log4j: Apache Log4j是一个基于java的日志工具,最初由Ceki Gülcü编写。它是Apache日志服务的一部分,是Apache软件基金会的一个项目。
  2. logback: 它是一个可靠、通用、快速和灵活的Java日志库。https://github.com/qos-ch/logback
  3. SLF4J: 通过一个简单的Facade模式提供了一个Java日志API。底层日志后端是在运行时通过向类路径添加所需的绑定来确定的,可以是标准的Sun Java日志包java.util.logging,Log4j, Reload4j, Logback

常常是slf4j搭配Log4j或者logback使用,使用slf4j的好处是随时可以替换log4j或者logback而不需要代码的引用处。log4j在性能表现上并没有logback优秀,当然log4j2相对于log4j有显著的提升,是对log4j的升级。本文主要记录SpinrgBoot如何集成slf4j和logback。此外会使用lombok来简化日志对象创建。

环境说明

SpringBoot的版本采用3.0.5

JDK版本为JDK17

Slf4j使用2.0.7版本

集成步骤

引入logback

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.4.8</version>
</dependency>

引入logback-classic依赖,会自动引入以下jar

  • logback-core.x.x.x.jar
  • slf4j-api-x.x.x.jar

引入lombok

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
            <scope>provided</scope>
        </dependency>

lombok的引入范围需要标记为provided,因为只需要在编译时需要。

配置logback-spring.xml

logback-spring.xml文件是在spring应用程序下对logback的配置文件,在其中可以使用到spring中配置的变量,而logback.xml可以在非spring项目使用。

logback-spring.xml的基础结构包含三个部分,

basic Syntax

appender标注将日志输出到何处,可以配置多个输出。常规的可以输出到文件,控制台,logstash等。

logger 用来设置某一个包或者具体的某一个类的日志打印级别,该部分可选。例如可以用在开发环境下需要打印Mybatis的日志

    <appender name="ROLL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/delay.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
    </appender>

以上我们配置了滚动将日志滚动输出到文件,滚动输出是指当文件到达一定的大小的时候会输出到一个新的文件。避免单个日志文件过大的情况


    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

以上我们配置了日志输出到控制台,开发时会使用,在实际生产环境下不应该输出。

在前面提到使用logback-spring.xml的优势是可以读取到spring的配置,常常我们日志的路径,日志级别常常可通过配置文件完成,因此接下来介绍spring环境变量的配置使用

    <springProperty scope="context" name="logPath" source="logging.file.path" default="/data/delay/log"/>
    <springProperty scope="context" name="rootLevel" source="logging.level.root" default="info"/>

在上面的例子中我们声明了两个变量logPath和rootLevel,分别来自于配置文件中的logging.file.path和logging.level.root,例如

logging:
  file:
    path: /data/delay/logs 
  level:
    root: INFO

可以通过${变量名}的形式进行引用,在最后完整的文件中可以看到使用。

在spring项目中我们可以指定spring的profile,使用了logback-spring.xml我们也可以将日志按照profile做不通环境的输出配置。

    <springProfile name="dev">
        <root level="${rootLevel}">
            <appender-ref ref="CONSOLE"/>
        </root>
    </springProfile>
&lt;springProfile name=&quot;prod&quot;&gt;
    &lt;root level=&quot;${rootLevel}&quot;&gt;
        &lt;appender-ref ref=&quot;ROLL_FILE&quot;/&gt;
    &lt;/root&gt;
&lt;/springProfile&gt;

以上的配置我们在环境为dev的时候仅输入到控制台,在prod的时候仅输出到文件中。

完整的配置文件

<configuration scan="true" scanPeriod="10 seconds">
    <contextName>logback</contextName>
&lt;springProperty scope=&quot;context&quot; name=&quot;logPath&quot; source=&quot;logging.file.path&quot; default=&quot;/data/delay/log&quot;/&gt;
&lt;springProperty scope=&quot;context&quot; name=&quot;rootLevel&quot; source=&quot;logging.level.root&quot; default=&quot;info&quot;/&gt;

&lt;appender name=&quot;CONSOLE&quot; class=&quot;ch.qos.logback.core.ConsoleAppender&quot;&gt; &lt;encoder&gt; &lt;pattern&gt;%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n&lt;/pattern&gt; &lt;!-- 设置字符集 --&gt; &lt;charset&gt;UTF-8&lt;/charset&gt; &lt;/encoder&gt; &lt;/appender&gt;

&lt;appender name=&quot;ROLL_FILE&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt; &lt;!-- 正在记录的日志文档的路径及文档名 --&gt; &lt;file&gt;${logPath}/delay.log&lt;/file&gt; &lt;!--日志文档输出格式--&gt; &lt;encoder&gt; &lt;pattern&gt;%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n&lt;/pattern&gt; &lt;charset&gt;UTF-8&lt;/charset&gt; &lt;!-- 此处设置字符集 --&gt; &lt;/encoder&gt; &lt;!-- 日志记录器的滚动策略,按日期,按大小记录 --&gt; &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt; &lt;fileNamePattern&gt;${logPath}/delay-%d{yyyy-MM-dd}.%i.log&lt;/fileNamePattern&gt; &lt;timeBasedFileNamingAndTriggeringPolicy class=&quot;ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP&quot;&gt; &lt;maxFileSize&gt;100MB&lt;/maxFileSize&gt; &lt;/timeBasedFileNamingAndTriggeringPolicy&gt; &lt;!--日志文档保留天数--&gt; &lt;maxHistory&gt;15&lt;/maxHistory&gt; &lt;/rollingPolicy&gt; &lt;/appender&gt;

&lt;springProfile name=&quot;dev&quot;&gt; &lt;root level=&quot;${rootLevel}&quot;&gt; &lt;appender-ref ref=&quot;CONSOLE&quot;/&gt; &lt;/root&gt; &lt;/springProfile&gt;

&lt;springProfile name=&quot;prod&quot;&gt; &lt;root level=&quot;${rootLevel}&quot;&gt; &lt;appender-ref ref=&quot;ROLL_FILE&quot;/&gt; &lt;/root&gt; &lt;/springProfile&gt;

</configuration>