图源:
虽然可以通过System.out.println
之类的方式向控制台直接输出一些信息进行最简单的调试,但这种方式并不正式,且很难将输出信息收集和统一管理分析。
正式的方式是使用日志,实际上很多编程语言甚至提供语言层级的日志支持,不过Java并没有相应的支持,需要我们选取一些适用于Spring Boot应用的日志框架。
事实上Spring Boot默认提供了对Logback
SLF4J
。
SLF4J
(Simple Logging Facade for Java)实际上是一个位于具体日志框架之上的抽象层:
图源:
使用SLF4J
而非具体某个日志框架,可以让你很容易地将项目中的底层日志框架进行替换和迁移。
下面简单演示一下如何在Spring Boot项目中使用SLF4J
记录日志。
本篇的示例在之前项目基础上进行修改,可以通过获取修改前的项目代码。
准备工作
添加SLF4J
依赖:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
底层日志框架这里使用Spring Boot默认的logback
,所以需要添加logback
的相关配置:
logging.config=./src/main/resources/logback.xml
logging.level.cn.icexmoon.my_first_app=TRACE
第一条指定了logback
具体的XML
配置文件路径,第二条指定了记录cn.icexmoon.my_first_app
包下的TRACE
级别日志。
具体分为这么几个级别:
-
TRACE:一般用于追踪程序运行流程。
-
DEBUG:调试。
-
INFO:记录程序运行信息。
-
WARN:警告信息,程序并不会立即崩溃,但存在问题。
-
ERROR:错误信息,可能引发程序崩溃。
这些错误级别从上到下依次升高。上边的配置实际上是指定的需要记录的最低级别日志,也就是说比TRACE
更严重的也会被记录,实际上就是记录所有级别的日志。一般需要在开发环境这样设置,在生产环境只会记录INFO
或WARN
以上级别的日志。
下面看相应的logback.xml
配置:
<configuration>
<!-- 日志内容格式 -->
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<!-- 日志文件路径规则 -->
<property name="FILE_PATH" value="D:/workspace/java/learn_spring_boot/ch10/log/%d{yyyy-MM-dd}.%i.log" />
<!-- 控制台日志输出设置 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 按照上面配置的LOG_PATTERN来打印日志 -->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 文件日志相关设置 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按照上面配置的FILE_PATH路径来保存日志 -->
<fileNamePattern>${FILE_PATH}</fileNamePattern>
<!-- 日志保存15天 -->
<maxHistory>15</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 单个日志文件的最大,超过则新建日志文件存储 -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<!-- 按照上面配置的LOG_PATTERN来打印日志 -->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 日志记录级别 -->
<logger name="cn.icexmoon.my_first_app" level="INFO" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
这里有详细的注释,所以不做说明。
记录日志
使用SLF4J
很容易,只需要通过LoggerFactory
获取一个Logger
对象,然后调用logger.debug
或logger.info
记录相应错误级别的日志即可:
package cn.icexmoon.my_first_app.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
public class HelloController {
"/hello")
( public String hello( (value="name",defaultValue="noname") String name){
Logger logger = LoggerFactory.getLogger(this.getClass());
logger.debug("hello world!================");
return String.format("Hello %s", name);
}
}
通过LoggerFactory.getLogger
获取Logger
时需要指定一个Logger
名称,通常用包名来命名,比如这里可以命名为cn.icexmoon.my_first_app.controller.HelloController.hello
等,通过this.getClass
获取当前类的完整名称来生成Logger
名称是个更简单的方式。
运行程序并尝试访问http://localhost:8080/hello
就能看到控制台输出日志,与此同时在相应的目录下也会生成日志文件。
使用注解
如果你的项目同时使用了lombok
,就可以用一种更简单的方式来使用slf4j
,即通过@Slf4j
注解来为当前的类生成一个默认的Logger
:
package cn.icexmoon.my_first_app.controller;
...
tags="用户管理")
(
"/user")
(public class UserController {
...
"获取用户列表")
( "")
( public String getUsers() {
log.info("getUsers is called.========");
Result result = new Result();
result.setData(userServiceInterface.getUsers());
return result.toString();
}
}
为类添加了@Slf4j
注解后,就可以直接在代码中使用log.info
来记录日志。
实际上这个注解的用途相当于:
public class UserController {
private final Logger log = LoggerFactory.getLogger(UserController.class);
...
}
好了,今天就到这里了,谢谢阅读。
本篇文章的最终代码可以从获取。
文章评论