一、概述
Spring Boot在所有内部日志中使用 Commons Logging ,但对底层日志的实现保持开放。 为 Java Util Logging 、 Log4j2 、 Logback 提供了默认配置。 在每一种情况下,记录器(logger)都被预设为使用控制台输出,也可以选择输出到文件。
默认情况下,如果你使用 “Starter”,则默认使用Logback。 适当的Logback路由也包括在内,以确保使用Java Util Logging、Commons Logging、Log4J或SLF4J的依赖库都能正确工作。
有很多适用于Java的日志框架。 如果上面的列表看起来很混乱,请不要担心。 一般来说,你不需要改变你的日志依赖,Spring Boot的默认值就很好用。
当你把你的应用程序部署到一个servlet容器或应用服务器时,用Java Util Logging API执行的日志不会被传送到你的应用程序的日志中。 这可以防止由容器或其他已经部署到它的应用程序执行的日志出现在你的应用程序的日志中。
二、 日志格式
Spring Boot的默认的日志输出格式类似于下面的例子。
2023-06-26T13:49:18.375+08:00 INFO 14424 --- [myapp] [ main] o.s.b.d.f.s.MyApplication : Starting MyApplication using Java 17 with PID 14424 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2023-06-26T13:49:18.390+08:00 INFO 14424 --- [myapp] [ main] o.s.b.d.f.s.MyApplication : No active profile set, falling back to 1 default profile: "default"
2023-06-26T13:49:20.197+08:00 INFO 14424 --- [myapp] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2023-06-26T13:49:20.218+08:00 INFO 14424 --- [myapp] [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-06-26T13:49:20.218+08:00 INFO 14424 --- [myapp] [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.10]
2023-06-26T13:49:20.412+08:00 INFO 14424 --- [myapp] [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2023-06-26T13:49:20.417+08:00 INFO 14424 --- [myapp] [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1882 ms
2023-06-26T13:49:21.069+08:00 INFO 14424 --- [myapp] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2023-06-26T13:49:21.078+08:00 INFO 14424 --- [myapp] [ main] o.s.b.d.f.s.MyApplication : Started MyApplication in 3.325 seconds (process running for 3.836)
输出的项目如下。
- Date和时Time:精确到毫秒,易于排序。
- 日志级别: ERROR, WARN, INFO, DEBUG, 或 TRACE.
- 进程ID。
- 一个 --- 分隔符,以区分实际日志信息的开始。
- Application name: 包含在方括号中(仅当 spring.application.name 被设置时才默认记录)。
- 线程名称:包含在方括号中(对于控制台输出可能会被截断)。
- 相关ID:如果启用了trace功能(上面的例子中没有显示)。
- 记录器名称:这通常是源类的名称(通常是缩写)。
- 日志消息。
Logback没有 FATAL 级别。 它被映射到 ERROR。
如果你有一个 spring.application.name 属性,但不希望它被记录,你可以将 logging.include-application-name 设置为 false。
三、 控制台输出
默认情况下,日志会输出 ERROR、WARN 和 INFO 级别的消息到控制台。 你也可以通过用 --debug 标志启动你的应用程序,来启用 debug 模式。
$ java -jar myapp.jar --debug
你也可以在你的 application.properties 中指定 debug=true
当debug模式被启用时,一些核心记录器(嵌入式容器、Hibernate和Spring Boot)被配置为输出更多信息。 启用debug模式并不意味着将你的应用程序配置为以 DEBUG 级别记录所有信息。
另外,你可以通过在启动应用程序时使用 --trace 标志(或在 application.properties 中使用 trace=true )来启用 “trace” 模式。 这样做可以对一些核心记录器(嵌入式容器、Hibernate schema生成和整个Spring组合)进行跟踪记录。
1. 彩色编码的输出
如果你的终端支持ANSI,就会使用彩色输出来帮助阅读。 你可以将 spring.output.ansi.enabled 设置为 支持的值,以覆盖自动检测。
颜色编码是通过使用 %clr 转换关键字来配置的。 在其最简单的形式中,转换器根据日志级别对输出进行着色,如下面的例子中所示。
%clr(%5p)
下表描述了日志级别与颜色的映射关系。
日志级别 | 颜色 |
FATAL | 红 |
ERROR | 红 |
WARN | 黄 |
INFO | 绿 |
DEBUG | 绿 |
TRACE | 绿 |
另外,你也可以通过为转换提供一个选项来指定应该使用的颜色或样式。 例如,要使文本为黄色,请使用以下设置。
%clr(%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}){yellow}
支持以下颜色和样式。
- blue
- cyan
- faint
- green
- magenta
- red
- yellow
四、 输出到文件
默认情况下,Spring Boot只向控制台记录日志,不写日志文件。 如果你想在控制台输出之外写日志文件,你需要设置 logging.file.name 或 logging.file.path 属性(例如,在你的 application.properties 中)。
下表显示了 logging.* 属性如何被一起使用。
Table 5. Logging properties | |||
logging.file.name | logging.file.path | Example | Description |
(none) | (none) | 只在控制台进行记录。 | |
指定文件 | (none) | my.log | 写入指定的日志文件。 名称可以是一个确切的位置,也可以是与当前目录的相对位置。 |
(none) | 指定目录 | /var/log | 将 spring.log 写到指定目录。 名称可以是一个确切的位置,也可以是与当前目录的相对位置。 |
日志文件在达到10MB时就会轮换,与控制台输出一样,默认情况下会记录 ERROR 、WARN 级和 INFO 级别的信息。
日志属性独立于实际的日志基础设施。 因此,特定的配置属性(如Logback的 logback.configurationFile )不由spring Boot管理。
五、文件轮换(滚动日志)
如果你使用Logback,可以使用你的 application.properties 或 application.yaml 文件来微调日志轮换设置。 对于所有其他的日志系统,你将需要自己直接配置轮换设置(例如,如果你使用Log4J2,那么你可以添加一个 log4j2.xml 或 log4j2-spring.xml 文件)。
支持以下轮换策略属性。
属性 | 说明 |
logging.logback.rollingpolicy.file-name-pattern | 用于创建日志归档的文件名模式。 |
logging.logback.rollingpolicy.clean-history-on-start | 应用程序启动时,是否行日志归档清理。 |
logging.logback.rollingpolicy.max-file-size | 日志文件归档前的最大尺寸(文件最大体积,达到这个体积就会归档)。 |
logging.logback.rollingpolicy.total-size-cap | 日志档案在被删除前的最大尺寸(归档文件最大占用大小,超过这个大小后会被删除)。 |
logging.logback.rollingpolicy.max-history | 要保留的归档日志文件的最大数量(默认为7)。 |
六、日志级别
所有支持的日志系统都可以通过使用 logging.level.<logger-name>=<level> 在Spring的 Environment(例如,在 application.properties)中设置日志级别,其中 level 是 TRACE, DEBUG, INFO, WARN, ERROR, FATAL, 或 OFF 之一。 root 记录器(logger)的级别可以通过 logging.level.root 来配置。
下面的例子显示了 application.properties 中潜在的日志设置。
Properties
Yaml
logging:level:root: "warn"org.springframework.web: "debug"org.hibernate: "error"
也可以使用环境变量来设置日志级别。 例如,LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG 将设置 org.springframework.web 为 DEBUG 。
上述方法只适用于包级日志。 由于宽松绑定总是将环境变量转换为小写字母,所以不可能用这种方式为单个类配置日志。 如果你需要为一个类配置日志,你可以使用SPRING_APPLICATION_JSON变量。
七、 日志组(Log Groups)
能够将相关的日志记录器分组,以便同时对它们进行配置,这通常很有用。 例如,你可能经常改变 所有 与Tomcat相关的记录器的记录级别,但你不容易记住最高级别的包。
为了帮助解决这个问题,Spring Boot允许你在Spring Environment 中定义日志组。 例如,你可以通过在 application.properties 中加入 “tomcat” group 来定义它。
Properties
Yaml
logging:group:tomcat: "org.apache.catalina,org.apache.coyote,org.apache.tomcat"
一旦定义好后,就可以用一行代码来改变组中所有logger的级别。
Properties
Yaml
logging:level:tomcat: "trace"
Spring Boot包括以下预定义的日志组,可以开箱即用。
组名 | 组中的logger |
web | org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans |
sql | org.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener |
八、 使用日志 Shutdown Hook
为了在你的应用程序终止时释放日志资源,我们提供了一个Shutdown Hook,它将在JVM退出时触发日志系统清理。 除非你的应用程序是以war文件的形式部署的,否则这个Shutdown Hook会自动注册。 如果你的应用程序有复杂的上下文层次结构,Shutdown Hook可能无法满足你的需求。 如果不能,请禁用关机钩子,并研究底层日志系统直接提供的选项。 例如,Logback提供了 context selectors,允许每个记录器在它自己的上下文中被创建。 你可以使用 logging.register-shutdown-hook 属性来禁用Shutdown Hook。 将其设置为 false 将禁用注册。 你可以在你的 application.properties 或 application.yaml 文件中设置该属性。
Properties
Yaml
logging:register-shutdown-hook: false
九、 自定义日志配置
各种日志系统可以通过在classpath上包含适当的库来激活,并且可以通过在classpath的根目录下或在 Spring Environment 属性指定的位置提供一个合适的配置文件来进一步定制: logging.config。
你可以通过使用 org.springframework.boot.logging.LoggingSystem 系统属性,强制Spring Boot使用特定的日志系统。 该值应该是 LoggingSystem 实现的全类名。 你也可以通过使用 none 的值来完全禁用Spring Boot的日志配置。
S由于日志是在创建 ApplicationContext 之前初始化的,所以不可能从Spring @Configuration 文件中的 @PropertySources 控制日志。 改变日志系统或完全停用它的唯一方法是通过System properties。 |
根据你的日志系统,会加载以下文件。
日志系统 | 配置文件 |
Logback | logback-spring.xml, logback-spring.groovy, logback.xml 或者 logback.groovy |
Log4j2 | log4j2-spring.xml 或者 log4j2.xml |
JDK (Java Util Logging) | logging.properties |
在可能的情况下,我们建议你使用 -spring 变体来进行日志配置(例如, logback-spring.xml 而不是 logback.xml )。 如果你使用标准配置位置,Spring不能完全控制日志初始化。
当从 "可执行的jar "中运行时,Java Util Logging有一些已知的类加载问题,会导致问题。 如果可能的话,我们建议你在从 "可执行的jar" 中运行时避免使用它。
为了帮助定制,其他一些属性从Spring的 Environment 转移到System properties,如下表所示。
Spring Environment | System Property | 备注 |
logging.exception-conversion-word | LOG_EXCEPTION_CONVERSION_WORD | 记录异常时使用的转换词。 |
logging.file.name | LOG_FILE | 如果定义了,它将用于默认的日志配置中。 |
logging.file.path | LOG_PATH | 如果定义了,它将用于默认的日志配置中。 |
logging.pattern.console | CONSOLE_LOG_PATTERN | 在控制台(stdout)使用的日志输出模式。 |
logging.pattern.dateformat | LOG_DATEFORMAT_PATTERN | date 格式化. |
logging.charset.console | CONSOLE_LOG_CHARSET | 控制台输出日志的字符编码。 |
logging.threshold.console | CONSOLE_LOG_THRESHOLD | 用于控制台日志记录的日志级别。 |
logging.pattern.file | FILE_LOG_PATTERN | 要在文件中使用的日志模式(如果 LOG_FILE 被启用)。 |
logging.charset.file | FILE_LOG_CHARSET | 文件日志的字符编码(如果 LOG_FILE 被启用)。 |
logging.threshold.file | FILE_LOG_THRESHOLD | 用于文件日志记录的日志级别。 |
logging.pattern.level | LOG_LEVEL_PATTERN | 渲染日志级别时使用的格式(默认为 %5p )。 |
PID | PID | 当前的进程ID |
如果你使用Logback,以下属性也会被转移。
Spring Environment | System Property | 备注 |
logging.logback.rollingpolicy.file-name-pattern | LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN | 滚动日志文件名的模式(默认为 ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz )。 |
logging.logback.rollingpolicy.clean-history-on-start | LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START | 是否在启动时清理归档日志文件。 |
logging.logback.rollingpolicy.max-file-size | LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE | 最大日志文件大小。 |
logging.logback.rollingpolicy.total-size-cap | LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP | 要保留的日志备份的总大小。 |
logging.logback.rollingpolicy.max-history | LOGBACK_ROLLINGPOLICY_MAX_HISTORY | 要保留的最大归档日志文件数量。 |
所有支持的日志系统在解析其配置文件时都可以从 System properties 中获取属性。 例子见 spring-boot.jar 中的默认配置。
- Logback
- Log4j 2
- Java Util logging
如果你想在日志属性中使用占位符,你应该使用Spring Boot的语法而不是底层框架的语法。 值得注意的是,如果你使用Logback,你应该使用 : 作为属性名和其默认值之间的分隔符,而不是使用 :- 。
你可以通过只覆盖 LOG_LEVEL_PATTERN (或使用Logback的 logging.pattern.level )来向日志行添加MDC和其他临时内容。 例如,如果你使用 logging.pattern.level=user:%X{user} %5p ,那么默认的日志格式包含一个 "user" 的MDC条目,如果它存在的话,如下例所示。 |
十、 Logback 扩展
Spring Boot包括一些对Logback的扩展,可以帮助进行高级配置。 你可以在你的 logback-spring.xml 配置文件中使用这些扩展。
因为标准的 logback.xml 配置文件被过早加载,你不能在其中使用扩展。 你需要使用 logback-spring.xml 或者定义一个 logging.config 属性。
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]]
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]
扩展程序不能与 Logback的配置扫描 一起使用。 如果你试图这样做,对配置文件进行修改会导致类似于以下的错误被记录下来。
1. 特定的配置文件
<springProfile> 标签让你可以根据活动的Spring配置文件选择性地包括或排除配置的部分, 支持在 <configuration> 元素的任何地方定义它。 使用 name 属性来指定接受配置的配置文件。 <springProfile> 标签可以包含一个配置文件名称(例如 staging )或一个配置文件表达式。 配置文件表达式允许表达更复杂的配置文件逻辑,例如 production & (eu-central | eu-west) 。 查看 Spring 框架参考指南 以了解更多细节。 下面的列表显示了三个样本配置文件。
<springProfile name="staging"><!-- configuration to be enabled when the "staging" profile is active -->
</springProfile><springProfile name="dev | staging"><!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile><springProfile name="!production"><!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>
2. (环境属性)Environment Properties
<springProperty> 标签可以访问 Spring Environment 中的属性,以便在Logback中使用。 如果你想在Logback配置中访问 application.properties 文件中的值,这样做会很有用。 该标签的工作方式与Logback的标准 <property> 标签类似。 然而,你不是直接指定一个 value ,而是指定属性的 source (来自 Environment )。 如果你需要在 local 范围以外的地方存储该属性,你可以使用 scope 属性。 如果你需要一个后备值(默认值)(万一该属性没有在 Environment 中设置),你可以使用 defaultValue 属性。 下面的例子显示了如何公开属性以便在Logback中使用。
<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"defaultValue="localhost"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender"><remoteHost>${fluentHost}</remoteHost>...
</appender>
source 必须以kebab风格指定(如 my.property-name )。 然而,属性可以通过使用宽松的规则添加到 Environment 中。 |
十一、 Log4j2 扩展
Spring Boot包括一些对Log4j2的扩展,可以帮助进行高级配置。你可以在任何 log4j2-spring.xml 配置文件中使用这些扩展。
因为标准的 log4j2.xml 配置文件被过早加载,你不能在其中使用扩展。你需要使用 log4j2-spring.xml 或者定义一个 logging.config 属性。
这些扩展取代了Log4J提供的 Spring Boot支持。 你应该确保在你的构建中不包括 org.apache.logging.log4j:log4j-spring-boot 模块。
1. 特定配置文件配置
<SpringProfile> 标签让你可以根据活动的Spring配置文件选择性地包括或排除配置的部分。配置文件部分被支持在 <Configuration> 元素的任何地方。使用 name 属性来指定哪个配置文件接受配置。 <SpringProfile> 标签可以包含一个配置文件名称(例如 staging)或一个配置文件表达式。 配置文件表达式允许表达更复杂的配置文件逻辑,例如 production & (eu-central | eu-west)。查看 Spring框架参考指南 以了解更多细节。 下面的列表显示了三个样本配置文件。
<SpringProfile name="staging"><!-- configuration to be enabled when the "staging" profile is active -->
</SpringProfile><SpringProfile name="dev | staging"><!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</SpringProfile><SpringProfile name="!production"><!-- configuration to be enabled when the "production" profile is not active -->
</SpringProfile>
2. 环境(Environment)属性查找
如果你想在Log4j2配置中引用Spring Environment 中的属性,你可以使用 spring: 前缀 查找。如果你想在Log4j2配置中访问 application.properties 文件中的值,这样做会很有用。
下面的例子显示了如何设置一个名为 applicationName 的Log4j2属性,它从Spring Environment 中读取 spring.application.name。
<Properties><Property name="applicationName">${spring:spring.application.name}</Property>
</Properties>
查询key应以kebabf风格指定(如 my.property-name)。
3. Log4j2 系统属性(System Properties)
Log4j2支持一些 System Properties,可以用来配置各种项目。例如,log4j2.skipJansi 系统属性可以用来配置 ConsoleAppender 是否会在Windows上尝试使用 Jansi 输出流。
Log4j2 初始化后加载的所有系统属性都可以从Spring Environment 中获得。例如,你可以在 application.properties 文件中添加 log4j2.skipJansi=false,让 ConsoleAppender 在Windows上使用Jansi。
只有当系统属性(system properties)和操作系统环境变量不包含正在加载的值时,才会考虑Spring Environment。
在早期Log4j2初始化期间加载的系统属性不能引用Spring Environment。例如,Log4j2用于允许选择默认Log4j2实现的属性是在 Spring Environment 可用之前使用的。
一、 概述
Spring Boot 对所有内部日志记录使用 Commons Logging,但使底层日志实现保持打开状态。 为 Java Util Logging、Log4j2 和 Logback 提供了缺省配置。 在每种情况下,记录器都预先配置为使用控制台输出,并提供可选的文件输出。
默认情况下,如果您使用“初学者”,则使用登录进行日志记录。 还包括适当的 Logback 路由,以确保使用 Java Util Logging、Commons Logging、Log4J 或 SLF4J 的依赖库都能正常工作。
二、日志格式
Spring Boot的默认日志输出类似于以下示例:
2023-02-23T14:18:26.407Z INFO 20239 --- [ main] o.s.b.d.f.s.MyApplication : Starting MyApplication using Java 17.0.6 with PID 20239 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2023-02-23T14:18:26.414Z INFO 20239 --- [ main] o.s.b.d.f.s.MyApplication : No active profile set, falling back to 1 default profile: "default"
2023-02-23T14:18:28.434Z INFO 20239 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2023-02-23T14:18:28.563Z INFO 20239 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-02-23T14:18:28.563Z INFO 20239 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.5]
2023-02-23T14:18:28.976Z INFO 20239 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2023-02-23T14:18:28.990Z INFO 20239 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2444 ms
2023-02-23T14:18:32.397Z INFO 20239 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2023-02-23T14:18:32.438Z INFO 20239 --- [ main] o.s.b.d.f.s.MyApplication : Started MyApplication in 7.241 seconds (process running for 8.232)
-
输出以下项目:
-
日期和时间:毫秒精度,易于排序。
-
日志级别:错误、警告、信息、调试或跟踪。
-
进程ID。
-
分隔符,用于区分实际日志消息的开头。
-
线程名称:用方括号括起来(对于控制台输出,可以截断)。
-
记录器名称:这通常是源类名(通常缩写)。
-
日志消息。
三、控制台输出
默认日志配置在写入消息时将消息回显到控制台。默认情况下,记录ERROR级别、WARN级别和INFO级别消息。您还可以通过使用--debug标志启动应用程序来启用“调试”模式。
$ java -jar myapp.jar --debug
启用调试模式后,将配置一组核心记录器(嵌入式容器、Hibernate和Spring Boot)以输出更多信息。启用调试模式不会将应用程序配置为使用debug级别记录所有消息。
或者,您可以通过使用--trace标志启动应用程序来启用“跟踪”模式(或在应用程序中使用trace=true。财产)。这样可以为选择的核心记录器(嵌入式容器、Hibernate模式生成和整个Spring组合)启用跟踪日志记录。
四、不同颜色编码输出
如果您的终端支持ANSI,则使用颜色输出来提高可读性。您可以将spring.output.ansi.enabled设置为支持的值,以覆盖自动检测。
通过使用%clr转换字配置颜色编码。在最简单的形式中,转换器根据日志级别为输出着色,如下例所示:
%clr(%5p)
下表描述了日志级别到颜色的映射:
Level | Color |
FATAL | Red |
ERROR | Red |
WARN | Yellow |
INFO | Green |
DEBUG | Green |
TRACE | Green |
或者,您可以通过将其作为转换选项来指定应使用的颜色或样式。例如,要使文本变为黄色,请使用以下设置:
%clr(%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}){yellow}
支持以下颜色和样式:
-
blue
-
cyan
-
faint
-
green
-
magenta
-
red
-
yellow
五、文件输出
默认情况下,Spring Boot只记录到控制台,不写入日志文件。如果要在控制台输出之外写入日志文件,则需要设置logging.file.name或logging.file.path属性(例如,在application.properties中)。
下表显示了logging.*财产如何一起使用:
表 8.日志记录属性
logging.file.name | logging.file.path | Example | Description |
(none) | (none) | 仅控制台日志记录。 | |
Specific file | (none) | my.log | 写入指定的日志文件。 名称可以是确切的位置,也可以是相对于当前目录的位置。 |
(none) | Specific directory | /var/log | 将spring.log写入指定目录。名称可以是确切的位置或相对于当前目录。 |
日志文件在达到10MB时会旋转,与控制台输出一样,默认情况下会记录ERROR级别、WARN级别和INFO级别的消息。
七、文件转换
如果使用Logback,则可以使用application.properties或application.yaml文件微调日志轮换设置。对于所有其他日志记录系统,您需要自己直接配置旋转设置(例如,如果使用Log4j2,则可以添加Log4j2.xml或Log4j2-pring.xml文件)。
支持以下轮换策略属性:
名字 | 描述 |
logging.logback.rollingpolicy.file-name-pattern | 用于创建日志存档的文件名模式。 |
logging.logback.rollingpolicy.clean-history-on-start | 如果应在应用程序启动时进行日志归档清理。 |
logging.logback.rollingpolicy.max-file-size | 日志文件存档前的最大大小。 |
logging.logback.rollingpolicy.total-size-cap | 日志存档在删除之前可以采用的最大大小。 |
logging.logback.rollingpolicy.max-history | 要保留的最大归档日志文件数(缺省值为 7)。 |
八、日志级别
所有支持的日志记录系统都可以通过使用logging.level.<logger-name>=<level>在Spring环境中设置日志记录程序级别(例如,在application.properties中),其中级别是TRACE、DEBUG、INFO、WARN、ERROR、FATAL或OFF之一。根日志记录程序可以通过使用日志记录.level.root进行配置。
以下示例显示application.properties中的潜在日志记录设置:
logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
还可以使用环境变量设置日志记录级别。例如,LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG将ORG.SPRINGFRAMEWORK.WEB设置为DEBUG。
上述方法仅适用于包级日志记录。由于宽松绑定总是将环境变量转换为小写,因此不可能以这种方式为单个类配置日志记录。如果需要为类配置日志记录,可以使用SPRING_APPLICATION_JSON变量。
九、日志组
能够将相关的记录器分组在一起,以便可以同时配置它们,这通常很有用。例如,您可能通常会更改所有Tomcat相关记录器的日志记录级别,但您不容易记住顶级包。
为了帮助实现这一点,Spring Boot允许您在Spring环境中定义日志组。例如,以下是如何通过将“tomcat”组添加到您的application.properties:
logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
定义后,您可以使用单行更改组中所有记录器的级别:
logging.level.tomcat=trace
Spring Boot包括以下预定义的日志记录组,可以立即使用:
Name | Loggers |
web | org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans |
sql | org.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener |
十、使用日志关闭钩子
为了在应用程序终止时释放日志资源,提供了一个在JVM退出时触发日志系统清理的关闭挂钩。除非将应用程序部署为war文件,否则会自动注册此关闭挂钩。如果应用程序具有复杂的上下文层次结构,则关闭挂钩可能无法满足您的需要。如果没有,请禁用关机挂钩并调查底层日志系统直接提供的选项。例如,Logback提供了上下文选择器,允许在自己的上下文中创建每个Logger。您可以使用logging.register-shutdown-hook属性禁用关机挂钩。将其设置为false将禁用注册。您可以在application.properties或application.yaml文件中设置属性:
logging.register-shutdown-hook=false
十一、自定义日志配置
可以通过在类路径中包含适当的库来激活各种日志记录系统,并且可以通过在路径的根目录中或在以下Spring Environment属性指定的位置提供适当的配置文件来进一步定制:logging.config。
通过使用org.springframework.Boot.logging.LoggingSystem系统属性,可以强制Spring Boot使用特定的日志记录系统。该值应该是LoggingSystem实现的完全限定类名。您还可以使用值none完全禁用Spring Boot的日志记录配置。
根据您的日志记录系统,将加载以下文件:
Logging System | Customization |
Logback | logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy |
Log4j2 | log4j2-spring.xml or log4j2.xml |
JDK (Java Util Logging) | logging.properties |
为了帮助定制,一些其他财产从Spring环境传输到系统财产,如下表所述:
Spring Environment | System Property | Comments |
logging.exception-conversion-word | LOG_EXCEPTION_CONVERSION_WORD | The conversion word used when logging exceptions. |
logging.file.name | LOG_FILE | If defined, it is used in the default log configuration. |
logging.file.path | LOG_PATH | If defined, it is used in the default log configuration. |
logging.pattern.console | CONSOLE_LOG_PATTERN | The log pattern to use on the console (stdout). |
logging.pattern.dateformat | LOG_DATEFORMAT_PATTERN | Appender pattern for log date format. |
logging.charset.console | CONSOLE_LOG_CHARSET | The charset to use for console logging. |
logging.pattern.file | FILE_LOG_PATTERN | The log pattern to use in a file (if LOG_FILE is enabled). |
logging.charset.file | FILE_LOG_CHARSET | The charset to use for file logging (if LOG_FILE is enabled). |
logging.pattern.level | LOG_LEVEL_PATTERN | The format to use when rendering the log level (default %5p). |
PID | PID | The current process ID (discovered if possible and when not already defined as an OS environment variable). |
如果使用 Logback,则还会传输以下属性:
Spring Environment | System Property | Comments |
logging.logback.rollingpolicy.file-name-pattern | LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN | Pattern for rolled-over log file names (default ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz). |
logging.logback.rollingpolicy.clean-history-on-start | LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START | Whether to clean the archive log files on startup. |
logging.logback.rollingpolicy.max-file-size | LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE | Maximum log file size. |
logging.logback.rollingpolicy.total-size-cap | LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP | Total size of log backups to be kept. |
logging.logback.rollingpolicy.max-history | LOGBACK_ROLLINGPOLICY_MAX_HISTORY | Maximum number of archive log files to keep |
所有受支持的日志记录系统在解析其配置文件时都可以参考System财产。有关示例,请参见spring-bot.jar中的默认配置:
-
Logback
-
Log4j 2
-
Java Util logging
十二、示例
Spring Boot 没有强制性的日志记录依赖项,除了通常由 Spring Framework 模块提供的 Commons Logging API。 要使用 Logback,您需要将其包含在类路径中。 推荐的方法是通过启动器,这完全取决于 . 对于 Web 应用程序,您只需要 ,因为它以传递方式依赖于日志记录启动器。 如果使用 Maven,则以下依赖项会为您添加日志记录:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
Spring Boot 有一个抽象,它试图根据类路径的内容配置日志记录。 如果 Logback 可用,则它是首选。LoggingSystem
如果需要对日志记录进行的唯一更改是设置各种记录器的级别,则可以使用“logging.level”前缀执行此操作,如以下示例所示:application.properties
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
除了控制台之外,您还可以使用 设置要将日志写入的文件的位置。要配置日志记录系统的更细粒度设置,您需要使用相关支持的本机配置格式。 默认情况下,Spring 引导从系统的默认位置(例如 Logback)选取本机配置,但您可以使用该属性设置配置文件的位置。
1、为日志记录配置回日志
如果需要将自定义应用于 logback,而不是可以使用 实现的自定义项,则需要添加标准 logback 配置文件。 您可以将文件添加到类路径的根目录中,以便进行回查
Spring 引导提供了许多登录配置,这些配置可以在您自己的配置中。 这些包括旨在允许重新应用某些常见的 Spring 引导约定。included
以下文件在 下提供:org/springframework/boot/logging/logback/
-
defaults.xml- 提供转换规则、模式属性和常用记录器配置。
-
console-appender.xml- 使用 .ConsoleAppenderCONSOLE_LOG_PATTERN
-
file-appender.xml- 使用适当的设置添加 和。RollingFileAppenderFILE_LOG_PATTERNROLLING_FILE_NAME_PATTERN
此外,还提供了旧文件以与早期版本的 Spring Boot 兼容。base.xml
典型的自定义文件如下所示:logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration><include resource="org/springframework/boot/logging/logback/defaults.xml"/><include resource="org/springframework/boot/logging/logback/console-appender.xml" /><root level="INFO"><appender-ref ref="CONSOLE" /></root><logger name="org.springframework.web" level="DEBUG"/>
</configuration>
您的登录配置文件还可以利用负责为您创建的系统属性:
-
${PID}:当前进程 ID。
-
${LOG_FILE}:是否在引导的外部配置中设置。logging.file.name
-
${LOG_PATH}:是否在 Boot 的外部配置中设置了(表示日志文件所在的目录)。logging.file.path
-
${LOG_EXCEPTION_CONVERSION_WORD}:是否在引导的外部配置中设置。logging.exception-conversion-word
-
${ROLLING_FILE_NAME_PATTERN}:是否在引导的外部配置中设置。logging.pattern.rolling-file-name
Spring Boot 还通过使用自定义 Logback 转换器在控制台上(但不在日志文件中)提供了一些不错的 ANSI 颜色终端输出
2、配置 log4j 用于日志记录
Spring Boot 支持 Log4j 2 进行日志记录配置,如果它位于类路径上。 如果使用启动器来组装依赖项,则必须排除 Logback,然后改为包含 Log4j 2。 如果您不使用启动器,除了 Log4j 2 之外,您还需要(至少)提供。
推荐的路径是通过启动器,即使它需要一些摇晃。 以下示例显示了如何在 Maven 中设置启动器:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</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>
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class Log4j2Test {private static final Logger logger = LogManager.getLogger();public Log4j2Test(){logger.info( "Hello World!" );}
}