SpringBoot日志系统、其他日志实现的整合。
日志系统主要概念
在Spring Boot中,日志门面和日志实现之间存在一种桥接机制。
日志门面
日志门面是一个抽象的接口层,提供了记录日志事件的一些规范和方法定义,开发者可以通过它来记录日志。日志门面接口是用来描述Java应用程序如何从代码中记录日志事件的API,它提供了统一的接口让开发人员在应用程序中记录日志,从而使得开发者可以更加方便地切换不同的日志框架。而具体使用哪个日志实现则是由开发者自己选择并配置的。
Spring Boot默认使用SLF4J(Simple Logging Facade for Java)作为日志门面,在代码中使用SLF4J提供的API来记录日志。SLF4J定义了一组接口用于发送日志消息,例如debug()、info()、error()等方法。
日志实现
日志实现则是具体实现这些方法的代码库,负责将记录下来的日志信息输出到对应的地方(如控制台、文件、数据库等)。在Spring Boot中,我们可以通过添加相应的依赖来选择需要使用的日志实现(如:Logback、Log4j2等)。这些依赖会提供一个对应的实现类库来按照SLF4J定义规范实现具体的日志输出。
因此,在编写代码时,我们只需要引入Spring Boot提供的相关依赖,并通过SLF4J API调用相关方法即可,无需关心底层的具体实现。而在运行时,则将根据项目所引入的依赖来确定具体使用哪种底层的日志实现。
SpringBoot日志使用
使用默认日志系统
SpringBoot默认使用的是Slf4j作为日志门面,Logback作为日志实现。
所以我们如果需要打印日志,可以创建项目后什么都不干,直接创建对象并调用方法,像这样:
1 2 3 4
| import org.slf4j.Logger; import org.slf4j.LoggerFactory;
|
1 2 3 4 5 6
| @RequestMapping("/login") public String login(){ Logger logger = LoggerFactory.getLogger(MainController.class); logger.info("用户访问了一次登陆界面"); return "login"; }
|
因为我们使用了Lombok,所以直接一个注解也可以搞定:
1 2 3 4 5 6 7 8 9
| @Slf4j @Controller public class MainController {
@RequestMapping("/login") public String login(){ log.info("用户访问了一次登陆界面");l return "login"; }
|
日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,SpringBoot默认只会打印INFO以上级别的信息。
整合log4j
要使用Log4j在Spring Boot项目中记录日志执行以下步骤:
- 在pom.xml文件中添加Log4j依赖。
1 2 3 4 5 6
| <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-spring-boot-starter</artifactId> <version>2.17.1</version> </dependency>
|
- 创建log4j.properties或log4j.xml文件来配置日志记录。
在src/main/resources目录下创建一个名为log4j.properties或者log4j.xml的文件。以下是一个简单的配置示例:
1 2 3 4 5 6 7 8 9
| #设置根logger的级别为info log4j.rootLogger=INFO,stdout
#控制台输出的appender log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#控制台输出的layout log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=[%p] %d %c - %m%n
|
- 使用Logger对象记录日志。
在Java类中,可以通过以下方式获取Logger对象:
1 2 3 4 5 6
| import org.slf4j.Logger; import org.slf4j.LoggerFactory;
public class DemoClass { private static final Logger logger = LoggerFactory.getLogger(DemoClass.class); }
|
然后,您可以使用Logger对象记录日志,如下所示:
1 2
| logger.info("This is an info message."); logger.error("This is an error message.", exception);
|
整合log4j2
在 Spring Boot 中,我们可以通过配置文件的方式来指定使用哪种日志系统。如果要使用 Log4j2 作为日志系统,可以按照以下步骤进行配置:
- 在 pom.xml 文件中添加 log4j2 的依赖,例如:
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
|
- 在 resources 目录下创建 log4j2.xml 配置文件,并按照需要指定日志输出目录、日志级别、格式等相关信息。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> <RollingFile name="RollingFile" fileName="/var/log/myapp.log" filePattern="/var/log/myapp-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout pattern="%d [%t] %-5level %logger{36} - %msg%n"/> <Policies> <SizeBasedTriggeringPolicy size="10 MB"/> </Policies> <DefaultRolloverStrategy max="10"/> </RollingFile> </Appenders>
<Loggers> <Logger name="com.example" level="debug" additivity="false"> <AppenderRef ref="RollingFile"/> </Logger>
<Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
|
以上配置将日志输出到 /var/log/myapp.log
文件中,并在控制台输出 info 级别及以上的日志信息。
- 在 application.properties 或 application.yml 配置文件中指定 Spring Boot 使用 Log4j2 作为日志系统,例如:
1 2 3 4 5 6
| logging.config=classpath:log4j2.xml
logging: config: classpath:log4j2.xml
|
通过以上配置,Spring Boot 就会自动加载 log4j2.xml 配置文件并使用 Log4j2 作为日志系统。我们还可以通过 LoggerFactory 来获取 Logger 实例来进行日志输出,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import org.slf4j.Logger; import org.slf4j.LoggerFactory;
@RestController public class MyController {
private static final Logger LOGGER = LoggerFactory.getLogger(MyController.class);
@GetMapping("/") public String index() { LOGGER.info("访问了首页"); return "Hello World!"; } }
|