环境:SpringBoot3.2.5
1. 简介
Spring Boot 将 Commons Logging 用于所有内部日志记录,但保留底层日志实现的开放性。为 Java Util Logging 、Log4j2 和 Logback 提供了默认配置。在每种情况下,日志记录器都预先配置为使用控制台输出,也可选择文件输出。
默认情况下,如果使用 "Starters",Logback 将用于日志记录。还包括适当的 Logback 路由,以确保使用 Java Util Logging、Commons Logging、Log4J 或 SLF4J 的依赖库都能正常工作。
注意:
在众多 Java 日志框架。如果上述列表看起来很混乱,请不要担心。一般来说,你需要更改日志记录依赖关系,Spring Boot 的默认设置就可以正常工作。
2. 详细配置
2.1 日志格式
Spring Boot 的默认日志输出类似于下面的示例:
五颜六色挺好看
以上日志格式输出项说明:
-
日期和时间:精确到毫秒,易于分类。
-
日志级别:ERROR、WARN、INFO、DEBUG 或 TRACE。
-
进程 ID。
-
分隔符 ---,用于区分实际日志信息的起始位置。
-
应用程序名称:用方括号括起来(默认情况下,只有设置了 spring.application.name 时才会记录)。
-
线程名称:用方括号括起来。
-
记录仪名称:通常是源类名称(通常是缩写)。
-
日志信息。
注意:
Logback 没有 FATAL 级别。它被映射为 ERROR。
如果你不想记录应用的名称,你可以通过如下配置:
*
*
logging: include-application-name: false
默认情况下,会记录 ERROR 级、WARN 级和 INFO 级信息。你可以通过下面属性进行设置启动"debug"模式: *
debug: true
也可以在命令行中指定: *
java -jar app.jar --debug
当然你还可以使用trace级别 *
trace: true
这个今天看文档才注意还可以直接配置trace 。以为只有debug 。
2.2 日志彩色输出
如果你的终端支持 ANSI,则日志信息会使用彩色进行输出来。可以通过如下属性配置: * * * *
spring: output: ansi: enabled: always
取值:DETECT , ALWAYS , NEVER
如果你的日志没有显示颜色(eclipse),那么你需要检查下面的选项是否勾选:
颜色编码通过 %clr 转换字进行配置。在最简单的形式下,转换器根据日志级别对输出进行着色,如下例所示: *
%clr(%5p)
下表描述了日志级别与颜色的映射关系:
|---------|--------| | 级别 | 颜色 | | FATAL | Red | | ERROR | Red | | WARN | Yellow | | INFO | Green | | DEBUG | Green | | TRACE | Green |
修改颜色
*
*
*
logging: pattern: console: "%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss}}){yellow} %clr(${LOG_LEVEL_PATTERN:-%5p}) ..."
在日志的日历后面添加{color}指定颜色值,支持的颜色:blue, cyan, faint, green, magenta, red, yellow。
2.3 日志文件输出
默认情况下,Spring Boot 只向控制台记录日志,不写入日志文件。如果想在控制台输出之外写入日志文件,则需要设置 logging.file.name 或 logging.file.path 属性(例如,在应用程序属性中)。如下示例: * * *
logging: file: name: myapp.log
这将在你项目的目录下生产myapp.log日志文件
注意: 如果你下面这样配置将不会达到你的预期
*
*
*
*
logging: file: name: myapp.log path: d:/logs/
此时并不会在你的d:/logs下生产myapp.log,而只会在当前项目的根目录下生产。
这2个属性配置不能同时配置,要使路径生效,那你只能配置logging.file.path 属性并且文件名是 "spring.log"。
默认情况下,当日志文件达到 10 MB 时,日志文件会轮转,与控制台输出一样,默认情况下会记录ERROR 级、WARN 级和 INFO 级信息。
2.4 日志文件滚动Rotation
如果你使用的是 Logback,则可以使用application.properties 或application.yaml 文件对日志滚动(产生新的日志文件)设置进行微调。如下示例: * * * * * * * * * * * * *
logging: logback: rollingpolicy: # 用于创建日志存档的文件名模式。 file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz # 是否应在应用程序启动时清理日志存档。 clean-history-on-start: false # 日志文件存档前的最大大小。 max-file-size: 1KB # 日志存档被删除前的最大容量。 total-size-cap: 0B # 要保留的归档日志文件的最大数量(默认为 7)。 max-history: 7
接下来,我们反复重启服务几次后,你将看到如下的日志及归档文件
2.5 日志级别
通过使用 logging.level.<logger-name>=<level>,可以在 Spring 环境(例如在 application.properties 中)中设置所有支持的日志系统的日志记录器级别,其中级别为 TRACE、DEBUG、INFO、WARN、ERROR、FATAL 或 OFF 之一。可以使用 logging.level.root 配置根日志记录器。如下示例: * * * * * * *
logging: level: root: info web: debug sql: debug "[org.springframework.web]": "debug" "[org.hibernate]": "debug"
当你访问Controller接口时,你将看到如下详细信息:
2.6 日志分组
将相关的日志记录器分组,以便同时对它们进行配置,通常是非常有用的。如下示例:
tomcat日志进行分组
*
*
*
logging: group: tomcat: "org.apache.catalina,org.apache.coyote,org.apache.tomcat"
上面我们将两个包进行划分为一组,接下来就可以对tomcat这个组进行日志级别的设置。 * * *
logging: level: tomcat: debug
输出结果
SpringBoot提供了默认的2个分组
2.7 日志关闭钩子
为了在应用程序终止时释放日志资源,SpringBoot提供了一个关闭钩子,它将在 JVM 退出时触发日志系统清理。只要你的程序不是以 war 文件的形式部署,那么该关闭钩子会自动注册。如果您的应用程序具有复杂的上下文层次结构,关闭钩子可能无法满足您的需求。如果无法满足,请禁用关闭钩子,并研究底层日志系统直接提供的选项。你可以通过如下属性进行关闭钩子: * *
logging: register-shutdown-hook: false
2.8 自定义日志配置
可以通过在类路径上包含适当的库来激活各种日志系统,并且可以通过在类路径的根目录中或如下属性设置指定配置文件: * *
logging: config: logback.xml
不同的日志系统加载的配置文件,如下:
**官方建议:**日志配置中使用 -spring 变体(例如,使用 logback-spring.xml 而不是 logback.xml)。
SpringBoot提供了如下属性配置及系统属性来定制日志:
2.9 Logback扩展
Spring Boot 为 Logback 提供了许多扩展,可以帮助进行高级配置。你可以在 logback-spring.xml 配置文件中使用这些扩展。
由于标准 logback.xml 配置文件加载过早,因此无法在其中使用扩展名。您需要使用 logback-spring.xml,或定义 logging.config 属性。
特定配置文件的配置
在logback-spring.xml文件中的<springProfile>
标签,可以根据当前激活的属性进行相关的配置。如下示例:
*
*
*
*
*
*
*
*
*
*
<springProfile name="prod"> <root level="ERROR"> <appender-ref ref="FILEERROR" /> </root></springProfile><springProfile name="dev"> <root level="INFO"> <appender-ref ref="CONSOLE" /> </root></springProfile>
根据spring.profiles.active属性值激活不同的<root>
环境属性
<springProperty> 标签可让你公开 Spring Environment 中的属性,以便在 Logback 中使用。如果你想在 Logback 配置中访问应用程序.properties 文件中的值,这样做会很有用。该标记的工作方式与 Logback 的标准 <property> 标记类似。不过,你指定的不是直接的值,而是属性的来源(来自环境)。如下示例: * * * * * * * *
<springProperty scope="context" name="appHost" source="pack.host" defaultValue="localhost"/><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <!-- 日志项中引入上面定义的属性 --> <pattern>%d{yyyy-MM-dd HH:mm} - ${appHost} - %-5level %logger Line:%-3L - %msg%n</pattern> <charset>UTF-8</charset> </encoder></appender>
上面示例中引用了appliation.properties或application.yml配置中的pack.host属性 * *
pack: host: pack-host
输出结果