常见的日志记录工具
- Log4j: Apache Log4j是一个基于java的日志工具,最初由Ceki Gülcü编写。它是Apache日志服务的一部分,是Apache软件基金会的一个项目。
- logback: 它是一个可靠、通用、快速和灵活的Java日志库。https://github.com/qos-ch/logback
- 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的基础结构包含三个部分,
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>
<springProfile name="prod">
<root level="${rootLevel}">
<appender-ref ref="ROLL_FILE"/>
</root>
</springProfile>
以上的配置我们在环境为dev的时候仅输入到控制台,在prod的时候仅输出到文件中。
完整的配置文件
<configuration scan="true" scanPeriod="10 seconds">
<contextName>logback</contextName>
<springProperty scope="context" name="logPath" source="logging.file.path" default="/data/delay/log"/>
<springProperty scope="context" name="rootLevel" source="logging.level.root" default="info"/>
<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>
<appender name="ROLL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>${logPath}/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>${logPath}/delay-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文档保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
</appender>
<springProfile name="dev">
<root level="${rootLevel}">
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
<springProfile name="prod">
<root level="${rootLevel}">
<appender-ref ref="ROLL_FILE"/>
</root>
</springProfile>
</configuration>