SpringBoot中正确使⽤Log的详细总结
Spring Boot中正确使⽤Log的详细总结
1. 概要
在本⽂中我们将总结Spring Boot中可⽤的主要⽇志框架的使⽤和配置。
Spring Boot内部模块都使⽤Commons Logging来记录⽇志,但是底层⽇志框架是可以替换的,⽀持的⽇志框架有:Java Util Logging 、Log4J2和Logback并为上述框架提供了默认配置。在默认情况下,⽇志记录器都预先配置为使⽤控制台输出,同时还提供可选的⽂件输出。
通常,当项⽬中使⽤Spring boot Starters 时,Logback作为默认⽇志框架。
当将应⽤程序部署到servlet容器或应⽤程序服务器时,通过Java Util Logging API记录的⽇志不会路由到应⽤程序的⽇志。这可以防⽌部署到容器或其他应⽤程序执⾏的⽇志记录出现在应⽤程序的⽇志中。
2. 初始化设置
让我们⾸先创建⼀个Spring boot web应⽤程序, 推荐的⽅法是使⽤Spring Initializr。接下来让我们创建⼀个类⽂件LoggingController:
@RestController
public class LoggingController {
Logger logger = Logger(LoggingController.class);
@RequestMapping("/")
public String index() {
logger.debug("A DEBUG Message");
logger.info("An INFO Message");
logger.warn("A WARN Message");
<("An ERROR Message");
return " hello log ";
}
}
3. ⽇志等级
Spring Boot还允许我们通过环境变量来对⽇志级别设置。有⼏种⽅法可以做到这⼀点。
第⼀种⽅式,我们可以通过VM参数来设置:
-springframework=TRACE
-Dlogging.level.baeldung=TRACE
第⼆种⽅式,:
mvn spring-boot:run
-Dspring-boot.run.arguments=--springframework=TRACE,--logging.level.baeldung=TRACE
第三种⽅式,使⽤application.properties 配置⽂件设置:
=WARN
logging.level.baeldung=TRACE
第四种⽅式,通过设置特定logging framework的配置⽂件:
springboot架构图前⾯提到Spring Boot Starter 默认情况下使⽤Logback作为⽇志框架。让我们来看看如何定义⼀个Logback配置⽂件⽚段,其中我们设置了两个独⽴包的级别:
<logger name="org.springframework" level="INFO" />
<logger name="com.baeldung" level="INFO" />
如果包的⽇志级别使⽤上⾯提到的不同配置⽅式定义多次,但是使⽤不同的⽇志级别,那么⽇志输出将使⽤最低级别
例如,如果我们同时使⽤Logback配置⽂件、Spring Boot 属性⽂件和环境变量设置⽇志级别,那么⽇志级别请求级别中最低的TRACE级别
4. 默认⽇志框架 Logback
当使⽤ spring boot starters 的时候,Logback作为默认的⽇志框架
如上图中我们所看到的,⽇志记录器的默认⽇志级别预设为INFO,TRACE和DEBUG⽇志消息是不可见的。我们可以在不改变配置的情况下改变⽇志输出,在命令⾏中传递–debug或–trace参数:
java -jar target/spring-boot-logging-0.0.1-SNAPSHOT.jar --trace
5. Logback 相关配置
尽管Spring Boot默认配置已经为我们准备好了Logback,但在⽣产环境中它很可能不⾜以满⾜我们的需求
下⾯通过⼀个简单例⼦说明如何通过Logback 配置⽂件配置⽇志框架
如何包含⼀个带有不同颜⾊和⽇志记录模式的⽇志回退配置,为控制台和⽂件输出使⽤单独的规范,并使⽤适当的滚动策略来避免⽣成巨⼤的⽇志⽂件
⼀般情况下避免把⽇志相关的配置放到application.propertiess 属性⽂件中,这样避免⽇志配置污染应⽤程序配置,我们选择使⽤独⽴的Logback配置⽂件
当上述名称的⽂件存在于classpath中的时候,spring boot 就会⾃动加载这些配置⽂件
⼀个简单的l 配置⽂件例⼦
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOGS" value="./logs" />
<appender name="Console"
class="ch.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
</Pattern>
</layout>
</appender>
<appender name="RollingFile"
class="ch.olling.RollingFileAppender">
<file>${LOGS}/spring-boot-logger.log</file>
<encoder
class="ch.qos.der.PatternLayoutEncoder">
<Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
</encoder>
<rollingPolicy
class="ch.olling.TimeBasedRollingPolicy">
<!-- rollover daily and when the file reaches 10 MegaBytes -->
<fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.olling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- LOG everything at INFO level -->
<root level="info">
<appender-ref ref="RollingFile" />
<appender-ref ref="Console" />
</root>
<!-- LOG "com.baeldung*" at TRACE level -->
<logger name="com.baeldung" level="trace" additivity="false">
<appender-ref ref="RollingFile" />
<appender-ref ref="Console" />
</logger>
</configuration>
当我们运⾏运⽤程序的时候,输出如下图:
6. Log4j2 相关配置
Spring boot使⽤Apache Commons⽇志框架作为核⼼,Logback是其中⼀种参考实现,Apache Commons已经包含了到其他⽇志库的所有路由,以便于切换到不同的⽇志框架上
为了使⽤Logback之外的任何⽇框架,⾸先我们需要将其从依赖项中排除,假如我们的系统是⼀个web应⽤依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
我们需要排除默认⽇志框架依赖和引⼊Log4j2依赖
<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>
spring-boot-starter-logging ⽇志实现⽅式是 Logback ,默认⽇志接下来,我们在classpath中增加⽇志配置⽂件
⼀个简单的l 配置⽂件如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout
pattern="%style{%d{ISO8601}}{black} %highlight{%-5level }[%style{%t}{bright,blue}] %style{%C{1.}}{bright,yellow}: %msg%n%throwable" /> </Console>
<RollingFile name="RollingFile"
fileName="./logs/spring-boot-logger-log4j2.log"
filePattern="./logs/$${date:yyyy-MM}/spring-boot-logger-log4j2-%d{-dd-MMMM-yyyy}-%">
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
<Policies>
<!-- rollover on startup, daily and when the file reaches
10 MegaBytes -->
<OnStartupTriggeringPolicy />
<SizeBasedTriggeringPolicy
size="10 MB" />
<TimeBasedTriggeringPolicy />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<!-- LOG everything at INFO level -->
<Root level="info">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFile" />
</Root>
<!-- LOG "com.baeldung*" at TRACE level -->
<Logger name="com.baeldung" level="trace"></Logger>
</Loggers>
</Configuration>
启动应⽤程序,我们可以看到如下输出:
7. 通过 Lombok 记录⽇志
为了避免在需要记录⽇志的每⼀个地⽅都申明⽇志记录器,我们可以引⼊Lombok来帮助我们简化代码
项⽬中增加maven依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
7.1 @Slf4j , @CommonsLog 注解使⽤
SLF4J和Apache Commons⽇志允许我们在不影响代码的情况下灵活地更改⽇志框架
我们可以使⽤Lombok的@Slf4j和@CommonsLog注解将正确的⽇志记录器实例添加到我们的类中
下⾯是⼀个使⽤@Slf4j注解的例⼦:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论