说明
在这个简短的教程中,我们将探索 Spring Boot 中可用的主要日志记录选项:logback 和log4j2
初始设置
使用 starters 时,默认使用 Logback 进行日志记录。 让我们首先创建一个 Spring Boot 模块。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
@RestController
public class LoggingController {
Logger logger = LoggerFactory.getLogger(LoggingController.class);
@RequestMapping("/")
public String index() {
logger.trace("A TRACE Message");
logger.debug("A DEBUG Message");
logger.info("An INFO Message");
logger.warn("A WARN Message");
logger.error("An ERROR Message");
return "Howdy! Check out the Logs to see the output...";
}
}
一旦我们加载了 Web 应用程序,我们就可以通过简单地访问http://localhost:8080/ 来触发这些日志记录行。
Spring Boot 使用模式和 ANSI 颜色对其进行预配置,以使标准输出更具可读性。 现在让我们运行应用程序并访问http://localhost:8080/页面,看看控制台中发生了什么。 我们可以看到,Logger 的默认日志级别预设为 INFO,这意味着TRACE和DEBUG消息是不可见的。
为了在不更改配置的情况下激活它们,我们可以在命令行上传递–debug或–trace参数:
java -jar target/spring-boot-logging-0.0.1-SNAPSHOT.jar --trace
日志级别
Spring Boot 还允许我们通过环境变量访问更细粒度的日志级别设置。有几种方法可以实现这一点。
首先,我们可以在 VM 选项中设置日志记录级别:
-Dlogging.level.org.springframework=TRACE
-Dlogging.level.com.test.java=TRACE
或者,如果我们使用 Maven,我们可以 通过命令行定义我们的日志设置:
mvn spring-boot:run
-Dspring-boot.run.arguments=--logging.level.org.springframework=TRACE,--logging.level.com.test.java=TRACE
使用 Gradle 时,我们可以通过命令行传递日志设置。这将需要设置bootRun任务。
完成后,我们运行应用程序:
./gradlew bootRun -Pargs=--logging.level.org.springframework=TRACE,--logging.level.com.test.java=TRACE
如果我们想永久更改详细程度,我们可以在application.properties文件中这样做,如下所述:
logging.level.root=WARN
logging.level.com.baeldung=TRACE
最后,我们可以使用我们的日志框架配置文件永久更改日志级别。
我们提到 Spring Boot Starter 默认使用 Logback。让我们看看如何定义一个 Logback 配置文件的片段,我们在其中为两个单独的包设置级别:
<logger name="org.springframework" level="INFO" />
<logger name="com.test.java" level="INFO" />
请记住,如果 使用上述不同选项多次定义包的日志级别,但使用不同的日志级别,将使用最低级别。
因此,如果我们同时使用 Logback、Spring Boot 和环境变量设置日志级别,那么日志级别将是TRACE,因为它是请求级别中最低的。
配置logback
尽管默认配置也挺好用,但无法满足我们实际企业对于生产环境中的日志记录。 比如:自定义的日志格式、日志输出基本、日志文件保存策略等等,为此我们需要自定义一份日志设置文件。 Spring Boot 启动时候会去类路径下按顺序查找以下配置文件:
- logback-spring.xml
- logback.xml
- logback-spring.groovy
- logback.groovy
此处,我们在resources 目录下新建logback-spring.xml ,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOGS" value="./logs" />
<appender name="Console"
class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%green(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
</Pattern>
</layout>
</appender>
<appender name="RollingFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOGS}/spring-boot-logger.log</file>
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
</encoder>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="RollingFile" />
<appender-ref ref="Console" />
</root>
<logger name="com.test.java" level="trace" additivity="false">
<appender-ref ref="RollingFile" />
<appender-ref ref="Console" />
</logger>
</configuration>
再次启动项目访问后,查看输出如下: 正如我们所看到的,它现在记录了TRACE和DEBUG消息,并且整个控制台模式在文本和色彩上都与以前不同。
它现在还登录在当前路径下创建的/logs文件夹中的文件,并通过滚动策略将其存档。
使用log4j2
除了使用默认的logback我们还推荐使用log4j2,从先进性上面来讲log4j2更胜一筹。 首先我们需要调整以下pom依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
此时,我们需要在类路径中放置一个配置文件,名称可以是下面这样:
- log4j2-spring.xml
- log4j2.xml
我们将通过 Log4j2(通过 SLF4J)打印,无需进一步修改。 让我们编写一个简单的log4j2-spring.xml:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOGS" value="./logs" />
<appender name="Console"
class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%green(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
</Pattern>
</layout>
</appender>
<appender name="RollingFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOGS}/spring-boot-logger.log</file>
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
</encoder>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="RollingFile" />
<appender-ref ref="Console" />
</root>
<logger name="com.test.java" level="trace" additivity="false">
<appender-ref ref="RollingFile" />
<appender-ref ref="Console" />
</logger>
</configuration>
@RestController
@Slf4j
public class LombokLoggingController {
@RequestMapping("/dolog4j")
public String index(){
log.trace("A TRACE Message");
log.debug("A DEBUG Message");
log.info("An INFO Message");
log.warn("A WARN Message");
log.error("An ERROR Message");
return "Howdy! Check out the Logs to see the output...";
}
}
启动程序访问后的日志输出如下:
|