日志记录配置
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中有问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息。
第 1 章 日志记录配置
阅读在 Quarkus 中使用日志 API,配置日志输出,以及使用日志记录适配器进行统一输出。
Quarkus 使用 JBoss Log Manager 日志记录后端发布应用程序和框架日志。Quarkus 支持 JBoss Logging API 和多个其他日志记录 API,与 JBoss Log Manager 无缝集成。您可以使用以下 API 中的任何一种 :
1.1. 使用 JBoss Logging 进行应用程序日志记录
使用 JBoss Logging API 时,您的应用程序不需要额外的依赖项,因为 Quarkus 会自动提供它。
使用 JBoss Logging API 记录消息的示例:
import org.jboss.logging.Logger; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; @Path("/hello") public class ExampleResource { private static final Logger LOG = Logger.getLogger(ExampleResource.class); @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { LOG.info("Hello"); return "hello"; } }
虽然 JBoss Logging 直接将日志消息路由到 JBoss Log Manager,但您的库之一可能依赖不同的日志记录 API。在这种情况下,您需要使用 日志适配器 来确保其日志消息被路由到 JBoss Log Manager。
1.2. 获取应用日志记录器
在 Quarkus 中,获取应用程序日志记录器的最常见方法是:
1.2.1. 声明日志记录器字段
借助此类方法,您可以使用特定的 API 获取日志记录器实例,将其存储在类的静态字段中,并在此实例上调用日志记录操作。
同一流可以使用 任何受支持的日志记录 API 应用。
使用 JBoss Logging API 将日志记录器实例存储在静态字段中的示例:
package com.example; import org.jboss.logging.Logger; public class MyService { private static final Logger log = Logger.getLogger(MyService.class); 1 public void doSomething() { log.info("It works!"); 2 } }
1.2.2. 简化的日志记录
Quarkus 通过自动将日志记录器字段添加到使用 io.quarkus.logging.Log
的类来简化日志记录。这消除了重复板代码的需求,并增强了日志记录设置便利。
使用静态方法调用的简化日志示例:
package com.example; import io.quarkus.logging.Log; 1 class MyService { 2 public void doSomething() { Log.info("Simple!"); 3 } }
仅在应用程序类中使用 Log
API,而不是在外部依赖项中使用。构建时没有由 Quarkus 处理的日志方法调用将抛出异常。
1.2.3. 注入配置的日志记录器
使用 @Inject
注解配置的 org.jboss.logging.Logger
日志记录器实例的注入是添加应用程序日志记录器的另一个替代方法,但仅适用于 CDI Bean。
您可以使用 @Inject Logger 日志
,其中日志记录器以您注入的类命名,或 @Inject @LoggerName ("…") Logger log
,其中日志记录器将接收指定名称。注入后,您可以使用 log
对象来调用日志记录方法。
两种不同类型的日志记录器注入示例:
import org.jboss.logging.Logger; @ApplicationScoped class SimpleBean { @Inject Logger log; 1 @LoggerName("foo") Logger fooLog; 2 public void ping() { log.info("Simple!"); fooLog.info("Goes to _foo_ logger!"); } }
日志记录器实例在内部缓存。因此,当注入日志记录器(例如,在 @RequestScoped
bean 中)时,它会共享所有 bean 实例,以避免可能与日志记录器实例化相关的性能。
1.3. 使用日志级别
Quarkus 提供不同的日志级别,这有助于开发人员根据事件的严重性控制记录的信息量。
表 1.1. Quarkus 使用的日志级别
OFF | 用于配置的特殊级别,以关闭日志记录。 |
FATAL | 关键服务故障或无法满足任何类型的请求。 |
ERROR | 请求出现重大中断,或者无法服务请求。 |
WARN | 可能需要立即修正的非关键服务错误或问题。 |
INFO | 服务生命周期事件或重要相关的低频率信息。 |
DEBUG | 提供有关生命周期或非绑定事件的额外信息的消息,可用于调试。 |
TRACE | 传递额外每个请求的调试信息的消息可能非常高。 |
ALL | 在配置中使用特殊级别来打开所有消息的日志记录,包括自定义级别。 |
您还可以为使用 java.util.logging
的应用程序和库配置以下级别:
严重 | 与 ERROR 相同。 |
WARNING | 与 WARN 相同。 |
CONFIG | 服务配置信息。 |
FINE | 与 DEBUG 相同。 |
FINER | 与 TRACE 相同。 |
FINEST |
与 |
数字级别值 | 标准级别名称 | 等效的 java.util.logging (JUL)级别名称 |
---|---|---|
1100 | FATAL | Not applicable |
1000 | ERROR | 严重 |
900 | WARN | WARNING |
800 | INFO | INFO |
700 | Not applicable | CONFIG |
500 | DEBUG | FINE |
400 | TRACE | FINER |
300 | Not applicable | FINEST |
1.4. 配置日志级别、类别和格式
JBoss Logging 内置在 Quarkus 中,为 所有支持的日志记录 API 提供统一配置。
在 application.properties
文件中配置运行时日志。
有关如何将默认日志级别设置为 INFO
日志的示例,并包含 Hibernate DEBUG
日志:
quarkus.log.level=INFO quarkus.log.category."org.hibernate".level=DEBUG
当您将日志级别设置为低于 DEBUG
时,您还必须调整最小日志级别。此设置可以是全局的,使用 quarkus.log.min-level
配置属性或每个类别:
quarkus.log.category."org.hibernate".min-level=TRACE
这会设置 Quarkus 需要为其生成支持代码的 floor 级别。构建时必须设置最小日志级别,以便 Quarkus 能够打开一项操作,以优化可以在不可用级别上登录的机会。
来自原生执行的示例:
将 INFO
设置为最低日志记录级别,将 isTraceEnabled
等低级别检查设置为 false
。这标识了诸如 if (logger.isDebug ())callMethod ()的代码;
该代码永远不会被执行并将其标记为"dead"。
如果您在命令行中添加这些属性,请确保正确转义 "
字符:
-Dquarkus.log.category.\"org.hibernate\".level=TRACE
所有潜在的属性都列在 日志记录配置参考部分。
1.4.1. 日志记录类别
日志记录会根据每个类别进行配置,每个类别都独立配置。除非有更具体的子类别配置,否则类别的配置会以递归方式适用于所有子类别。
所有日志记录类别的父级称为"root 类别"。作为最终的父级,此类别可能包含全局应用到所有其他类别的配置。这包括全局配置的处理程序和格式器。
例 1.1. 适用于所有类别的全局配置示例:
quarkus.log.handlers=console,mylog
在本例中,根类别配置为使用两个处理程序: console
和 mylog
。
例 1.2. 一个 per-category 配置示例:
quarkus.log.category."org.apache.kafka.clients".level=INFO quarkus.log.category."org.apache.kafka.common.utils".level=INFO
本例演示了如何在 org.apache.kafka. clients 和
类别上配置最小日志级别。
org.apache.kafka
.common.utils
如需更多信息,请参阅 日志记录配置参考。
如果要为特定类别配置一些额外内容,请创建一个命名处理程序,如 quarkus.log.handler.[console|file|syslog].<your-handler-name>
,并使用 quarkus.log.category.<my-category>.handlers
为该类别设置它。
示例用例可能需要对保存到文件(而不是用于其他处理程序的格式)的日志消息使用不同的时间戳格式。
有关进一步演示,请参阅 Attaching named handlers to a category example。
属性名称 | default | 描述 |
---|---|---|
|
|
配置名为 < |
|
|
配置名为 < |
|
| 指定此日志记录器是否应该将其输出发送到其父日志记录器。 |
|
| 要附加到特定类别的处理程序的名称。 |
[a]
有些扩展可能会为某些类别定义自定义的默认日志级别,以默认减少日志 noise。在配置中设置日志级别将覆盖任何扩展定义的日志级别。
[b]
默认情况下,配置的类别获取与根日志记录器上附加的处理程序相同的处理程序。
|
.
符号分隔配置属性中的特定部分。属性名称中的引号用作所需的转义来保持类别规格,如 quarkus.log.category."io.quarkus.smallrye.jwt".level=TRACE
, intact。
1.4.2. 根日志记录器配置
根日志记录器类别是单独处理的,并使用以下属性进行配置:
属性名称 | default | 描述 |
---|---|---|
|
| 每个日志类别的默认日志级别。 |
|
| 每个日志类别的默认最小日志级别。 |
- 如果给定日志记录器类别不存在级别配置,则会检查父类别。
- 如果没有为类别及其任何父类别提供特定配置,则使用根日志记录器配置。
虽然根日志记录器的处理程序通常通过 quarkus.log.console
、quarkus.log.file
和 quarkus.log.syslog
直接配置,但它无法使用 quarkus.log.handlers
属性附加到它。
1.5. 日志记录格式
Quarkus 使用基于模式的日志格式器,它默认生成人类可读的文本日志,但您也可以使用专用属性为每个日志处理程序配置格式。
对于控制台处理程序,属性为 quarkus.log.console.format
。
日志记录格式字符串支持以下符号:
符号 | 概述 | 描述 |
---|---|---|
|
|
呈现简单的 |
| 类别 | 呈现类别名称。 |
| 源类 | 呈现源类 name.footnote:calc[Format sequences,检查调用者信息可能会影响性能] |
| Date |
使用给定日期格式字符串呈现日期,它使用 |
| 例外 | 呈现出的异常(若有)。 |
| 源文件 | 呈现源文件 name.footnote:calc[] |
| 主机名 | 呈现系统简单主机名。 |
| 合格主机名 | 呈现系统的完全限定主机名,其名称可能与简单主机名相同,具体取决于操作系统配置。 |
| 进程 ID | 呈现当前进程 PID。 |
| 源位置 | 呈现源位置信息,其中包括源文件名、行号、类名称和方法 name.footnote:calc[] |
| 源行 | 呈现源行 number.footnote:calc[] |
| 完整消息 | 呈现日志消息加上例外(如果有)。 |
| 源方法 | 呈现源方法 name.footnote:calc[] |
| newline | 呈现特定于平台的行分隔符字符串。 |
| 进程名称 | 呈现当前进程的名称。 |
| 级别 | 呈现消息的日志级别。 |
| 相对时间 | 以毫秒为单位呈现应用程序日志开始的时间。 |
| 简单消息 | 只呈现日志消息,没有异常追踪。 |
| 线程名称 | 呈现线程名称。 |
| 线程 ID | 呈现线程 ID。 |
| 时区 |
将输出的时区设置为 < |
| 映射诊断上下文值 | 呈现来自映射诊断上下文的值 |
| 映射诊断上下文值 | 呈现 Mapped Diagnostic Context 中的所有值,格式为 {property.key=property.value} |
| 嵌套诊断上下文值 | 呈现 Nested Diagnostics Context 中的所有值,格式为 {value1.value2} |
1.5.1. 其他控制台日志记录格式
更改控制台日志格式很有用,例如,当 Quarkus 应用的控制台输出被处理并存储日志信息以便稍后进行分析时。
1.5.1.1. JSON 日志记录格式
可使用 quarkus-logging-json
扩展来添加对 JSON 日志记录格式及其相关配置的支持。
在构建文件中添加此扩展,如以下代码片段所示:
使用 Maven:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-logging-json</artifactId> </dependency>
使用 Gradle :
implementation("io.quarkus:quarkus-logging-json")
默认情况下,存在此扩展会替换控制台配置中的输出格式配置,格式字符串和颜色设置(若有)将被忽略。其他控制台配置项目(包括控制异步日志记录和日志级别)将继续应用。
在某些情况下,在 dev 模式中使用人类可读的(不结构化)登录,在生产环境模式中使用 JSON 日志记录(structured)会有意义。这可以通过使用不同配置集来实现,如以下配置所示。
在 dev 和 test 模式的 application.properties 中禁用 JSON 日志记录
%dev.quarkus.log.console.json=false %test.quarkus.log.console.json=false
1.5.1.1.1. 配置
使用支持的属性配置 JSON 日志扩展,以自定义其行为。
构建时修复的配置属性 - 所有其他配置属性可在运行时覆盖
类型 | default | |
确定是否启用 JSON 控制台格式扩展,它会禁用"常规"控制台格式。
环境变量: | 布尔值 |
|
启用 JSON 记录的"pretty 打印"。请注意,一些 JSON 解析器将无法读取用户友善打印的输出。
环境变量: | 布尔值 |
|
要使用的日期格式。特殊字符串 "default" 表示应使用默认格式。
环境变量: | string |
|
要使用的特殊记录分隔符。默认情况下使用 newline。
环境变量: | string | |
要使用的区域 ID。特殊字符串 "default" 表示应使用默认区域。
环境变量: | string |
|
要指定的异常输出类型。
环境变量: |
|
|
在日志中启用打印更多详细信息。 打印详细信息可能比较昂贵,因为值是从调用者检索的。详情包括源类名称、源文件名、源方法名称和源行号。
环境变量: | 布尔值 |
|
使用自定义值覆盖键。省略这个值表示不会应用任何键覆盖。
环境变量: | string | |
要排除在 JSON 输出中的密钥。
环境变量: | 字符串列表 | |
其他字段值。
环境变量: | string | 必需 |
其他字段类型规格。支持的类型:string, int, long String 是默认值(如果未指定)。
环境变量: |
|
|
类型 | default | |
确定是否启用 JSON 控制台格式扩展,它会禁用"常规"控制台格式。
环境变量: | 布尔值 |
|
启用 JSON 记录的"pretty 打印"。请注意,一些 JSON 解析器将无法读取用户友善打印的输出。
环境变量: | 布尔值 |
|
要使用的日期格式。特殊字符串 "default" 表示应使用默认格式。
环境变量: | string |
|
要使用的特殊记录分隔符。默认情况下使用 newline。
环境变量: | string | |
要使用的区域 ID。特殊字符串 "default" 表示应使用默认区域。
环境变量: | string |
|
要指定的异常输出类型。
环境变量: |
|
|
在日志中启用打印更多详细信息。 打印详细信息可能比较昂贵,因为值是从调用者检索的。详情包括源类名称、源文件名、源方法名称和源行号。
环境变量: | 布尔值 |
|
使用自定义值覆盖键。省略这个值表示不会应用任何键覆盖。
环境变量: | string | |
要排除在 JSON 输出中的密钥。
环境变量: | 字符串列表 | |
其他字段值。
环境变量: | string | 必需 |
其他字段类型规格。支持的类型:string, int, long String 是默认值(如果未指定)。
环境变量: |
|
|
类型 | default | |
确定是否启用 JSON 控制台格式扩展,它会禁用"常规"控制台格式。
环境变量: | 布尔值 |
|
启用 JSON 记录的"pretty 打印"。请注意,一些 JSON 解析器将无法读取用户友善打印的输出。
环境变量: | 布尔值 |
|
要使用的日期格式。特殊字符串 "default" 表示应使用默认格式。
环境变量: | string |
|
要使用的特殊记录分隔符。默认情况下使用 newline。
环境变量: | string | |
要使用的区域 ID。特殊字符串 "default" 表示应使用默认区域。
环境变量: | string |
|
要指定的异常输出类型。
环境变量: |
|
|
在日志中启用打印更多详细信息。 打印详细信息可能比较昂贵,因为值是从调用者检索的。详情包括源类名称、源文件名、源方法名称和源行号。
环境变量: | 布尔值 |
|
使用自定义值覆盖键。省略这个值表示不会应用任何键覆盖。
环境变量: | string | |
要排除在 JSON 输出中的密钥。
环境变量: | 字符串列表 | |
其他字段值。
环境变量: | string | 必需 |
其他字段类型规格。支持的类型:string, int, long String 是默认值(如果未指定)。
环境变量: |
|
|
启用用户用户打印可能会导致某些处理器和 JSON 解析器失败。
打印详细信息可能比较昂贵,因为值是从调用者检索的。详情包括源类名称、源文件名、源方法名称和源行号。
1.6. 日志处理程序
日志处理程序是一个日志记录组件,负责将日志事件委托给接收者。Quarkus 包括几个不同的日志处理程序: 控制台、file 和 syslog。
特色示例使用 com.example
作为日志记录类别。
1.6.1. 控制台日志处理程序
控制台日志处理程序默认为启用,它会将所有日志事件定向到应用程序的控制台,通常是系统的 stdout
。
全局配置示例:
quarkus.log.console.format=%d{yyyy-MM-dd HH:mm:ss} %-5p [%c] (%t) %s%e%n
每个category 配置示例:
quarkus.log.handler.console.my-console-handler.format=%d{yyyy-MM-dd HH:mm:ss} [com.example] %s%e%n quarkus.log.category."com.example".handlers=my-console-handler quarkus.log.category."com.example".use-parent-handlers=false
有关其配置的详情,请参阅 控制台日志记录配置 参考。
1.6.2. 文件日志处理程序
要将事件记录到应用主机上的文件中,请使用 Quarkus 文件日志处理程序。文件日志处理程序默认为禁用,因此您必须首先启用它。
Quarkus 文件日志处理程序支持日志文件轮转。日志文件轮转通过维护指定数量的备份日志文件,同时保持主日志文件最新和可管理,从而确保一段时间内有效的日志文件管理。
日志文件轮转通过维护指定数量的备份日志文件来确保一段时间内有效的日志文件管理,同时保持主日志文件最新和可管理。
全局配置示例:
quarkus.log.file.enable=true quarkus.log.file.path=application.log quarkus.log.file.format=%d{yyyy-MM-dd HH:mm:ss} %-5p [%c] (%t) %s%e%n
每个category 配置示例:
quarkus.log.handler.file.my-file-handler.enable=true quarkus.log.handler.file.my-file-handler.path=application.log quarkus.log.handler.file.my-file-handler.format=%d{yyyy-MM-dd HH:mm:ss} [com.example] %s%e%n quarkus.log.category."com.example".handlers=my-file-handler quarkus.log.category."com.example".use-parent-handlers=false
有关其配置的详情,请查看 文件日志记录配置 参考。
1.6.3. syslog 日志处理程序
Quarkus 中的 syslog 处理程序遵循 Syslog 协议,该协议用于在类似 UNIX 的系统上发送日志消息。它使用 RFC 5424 中定义的协议。
默认情况下禁用 syslog 处理程序。启用后,它会将所有日志事件发送到 syslog 服务器,通常是应用程序的本地 syslog 服务器。
全局配置示例:
quarkus.log.syslog.enable=true quarkus.log.syslog.app-name=my-application quarkus.log.syslog.format=%d{yyyy-MM-dd HH:mm:ss} %-5p [%c] (%t) %s%e%n
每个category 配置示例:
quarkus.log.handler.syslog.my-syslog-handler.enable=true quarkus.log.handler.syslog.my-syslog-handler.app-name=my-application quarkus.log.handler.syslog.my-syslog-handler.format=%d{yyyy-MM-dd HH:mm:ss} [com.example] %s%e%n quarkus.log.category."com.example".handlers=my-syslog-handler quarkus.log.category."com.example".use-parent-handlers=false
有关其配置的详情,请查看 Syslog 日志记录配置 参考。
1.7. 在日志处理程序中添加日志过滤器
日志处理程序(如控制台日志处理程序)可以与决定是否应记录日志记录 的过滤器 相关联。
注册日志记录过滤器:
使用
@io.quarkus.logging.LoggingFilter
注解实现java.util.logging.Filter
的最后一个
类,并设置name
属性:编写过滤器的示例:
import io.quarkus.logging.LoggingFilter; import java.util.logging.Filter; import java.util.logging.LogRecord; @LoggingFilter(name = "my-filter") public final class TestFilter implements Filter { private final String part; public TestFilter(@ConfigProperty(name = "my-filter.part") String part) { this.part = part; } @Override public boolean isLoggable(LogRecord record) { return !record.getMessage().contains(part); } }
在本例中,我们排除了包含控制台日志中特定文本的日志记录。要过滤的特定文本不是硬编码的,而是从
my-filter.part
配置属性中读取。在
application.properties
中配置过滤器的示例:my-filter.part=TEST
使用位于
application.properties
中的过滤器
配置属性,将过滤器附加到对应的处理器中:quarkus.log.console.filter=my-filter
1.8. 日志配置示例
以下示例显示了您可以在 Quarkus 中配置日志的一些方法:
控制台 DEBUG 日志记录,除了 Quarkus 日志(INFO),没有颜色、缩短时间、短的类别前缀
quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n quarkus.log.console.level=DEBUG quarkus.console.color=false quarkus.log.category."io.quarkus".level=INFO
如果您在命令行中添加这些属性,请确保 "
is escaped.例如,-Dquarkus.log.category.\"io.quarkus\".level=DEBUG
。
文件 TRACE 日志记录配置
quarkus.log.file.enable=true # Send output to a trace.log file under the /tmp directory quarkus.log.file.path=/tmp/trace.log quarkus.log.file.level=TRACE quarkus.log.file.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n # Set 2 categories (io.quarkus.smallrye.jwt, io.undertow.request.security) to TRACE level quarkus.log.min-level=TRACE quarkus.log.category."io.quarkus.smallrye.jwt".level=TRACE quarkus.log.category."io.undertow.request.security".level=TRACE
由于我们不更改根日志记录器,控制台日志将仅包含 INFO
或更高级别的日志。
附加到类别的命名处理程序
# Send output to a trace.log file under the /tmp directory quarkus.log.file.path=/tmp/trace.log quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n # Configure a named handler that logs to console quarkus.log.handler.console."STRUCTURED_LOGGING".format=%e%n # Configure a named handler that logs to file quarkus.log.handler.file."STRUCTURED_LOGGING_FILE".enable=true quarkus.log.handler.file."STRUCTURED_LOGGING_FILE".format=%e%n # Configure the category and link the two named handlers to it quarkus.log.category."io.quarkus.category".level=INFO quarkus.log.category."io.quarkus.category".handlers=STRUCTURED_LOGGING,STRUCTURED_LOGGING_FILE
附加到根日志记录器的命名处理程序
# configure a named file handler that sends the output to 'quarkus.log' quarkus.log.handler.file.CONSOLE_MIRROR.enable=true quarkus.log.handler.file.CONSOLE_MIRROR.path=quarkus.log # attach the handler to the root logger quarkus.log.handlers=CONSOLE_MIRROR
1.9. 集中式日志管理
使用集中位置,高效地收集、存储和分析应用各个组件和实例的日志数据。
要将日志发送到集中工具,如 Graylog、Logstash 或 Fluentd,请参阅 Quarkus 集中式日志 管理指南。
1.10. 为 @QuarkusTest
配置日志记录
通过将 java.util.logging.manager
系统属性设置为 org.jboss.logmanager.LogManager
,为 @QuarkusTest
启用正确的日志记录。
系统属性必须在早期设置才能生效,因此建议在构建系统中进行配置。
在 Maven Surefire 插件配置中设置 java.util.logging.manager
系统属性
<build> <plugins> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>${surefire-plugin.version}</version> <configuration> <systemPropertyVariables> <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> 1 <quarkus.log.level>DEBUG</quarkus.log.level> 2 <maven.home>${maven.home}</maven.home> </systemPropertyVariables> </configuration> </plugin> </plugins> </build>
对于 Gradle,请在 build.gradle
文件中添加以下配置:
test { systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" }
请参阅从 IDE 运行 @QuarkusTest
。
1.11. 使用其他日志记录 API
Quarkus 依赖于 JBoss Logging 库来满足所有日志记录要求。
假设您使用依赖于其他日志记录库的库,如 Apache Commons Logging、Log4j 或 SLF4J。在这种情况下,从依赖项中排除它们,并使用其中一个 JBoss Logging 适配器。
这在构建原生可执行文件时尤为重要,因为在编译原生可执行文件时可能会遇到类似如下的问题:
Caused by java.lang.ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl
日志记录实施不包括在原生可执行文件中,但您可以使用 JBoss Logging 适配器解决这个问题。
这些适配器可用于流行的开源日志记录组件,如下一章节中所述。
1.11.1. 在应用程序中添加日志适配器
对于不是 jboss-logging
的每个日志记录 API:
添加日志记录适配器库,以确保通过这些 API 记录的消息被路由到 JBoss Log Manager 后端。
注意对于作为 Quarkus 扩展依赖项的库,这个步骤不需要扩展自动处理它。
Apache Commons Logging:
使用 Maven:
<dependency> <groupId>org.jboss.logging</groupId> <artifactId>commons-logging-jboss-logging</artifactId> </dependency>
使用 Gradle :
implementation("org.jboss.logging:commons-logging-jboss-logging")
Log4j:
使用 Maven:
<dependency> <groupId>org.jboss.logmanager</groupId> <artifactId>log4j-jboss-logmanager</artifactId> </dependency>
使用 Gradle :
implementation("org.jboss.logmanager:log4j-jboss-logmanager")
Log4j 2:
使用 Maven:
<dependency> <groupId>org.jboss.logmanager</groupId> <artifactId>log4j2-jboss-logmanager</artifactId> </dependency>
使用 Gradle :
implementation("org.jboss.logmanager:log4j2-jboss-logmanager")
注意不要包含任何 Log4j 依赖项,因为
log4j2-jboss-logmanager
库包含使用 Log4j 作为日志实施所需的所有操作。
SLF4J:
使用 Maven:
<dependency> <groupId>org.jboss.slf4j</groupId> <artifactId>slf4j-jboss-logmanager</artifactId> </dependency>
使用 Gradle :
implementation("org.jboss.slf4j:slf4j-jboss-logmanager")
- 验证添加的库生成的日志是否遵循与其他 Quarkus 日志相同的格式。
1.11.2. 使用 MDC 添加上下文日志信息
Quarkus 覆盖了日志记录映射的诊断上下文(MDC),以提高其重新活跃内核的兼容性。
1.11.2.1. 添加和读取 MDC 数据
在 MDC 中添加数据并将其提取到日志输出中:
-
使用
MDC
类来设置数据。 -
自定义日志格式以使用
%X{mdc-key}
。
让我们考虑以下代码:
使用 JBoss Logging 和 io.quarkus.logging.Log
的示例
package me.sample; import io.quarkus.logging.Log; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import org.jboss.logmanager.MDC; import java.util.UUID; @Path("/hello/jboss") public class GreetingResourceJbossLogging { @GET @Path("/test") public String greeting() { MDC.put("request.id", UUID.randomUUID().toString()); MDC.put("request.path", "/hello/test"); Log.info("request received"); return "hello world!"; } }
如果您使用以下行配置日志格式:
quarkus.log.console.format=%d{HH:mm:ss} %-5p request.id=%X{request.id} request.path=%X{request.path} [%c{2.}] (%t) %s%n
您会收到包含 MDC 数据的消息:
08:48:13 INFO request.id=c37a3a36-b7f6-4492-83a1-de41dbc26fe2 request.path=/hello/test [me.sa.GreetingResourceJbossLogging] (executor-thread-1) request received
1.11.2.2. MDC 和支持的日志记录 API
根据您使用的 API,MDC 类略有不同。但是,API 非常相似:
-
Log4j 1 -
org.apache.log4j.MDC.put (key, value)
-
Log4j 2 -
org.apache.logging.log4j.ThreadContext.put(key, value)
-
SLF4J -
org.slf4j.MDC.put(key, value)
1.11.2.3. MDC propagation
在 Quarkus 中,MDC 供应商具有处理被动上下文的特定实现,可确保在被动和异步处理过程中传播 MDC 数据。
因此,您仍可在各种情况下访问 MDC 数据:
- 异步调用后,例如当 REST 客户端返回 Uni 时。
-
在提交至
org.eclipse.microprofile.context.ManagedExecutor
的代码中。 -
在使用
vertx.executeBlocking ()
执行的代码中。
如果适用,MDC 数据存储在 重复的上下文中,这是处理单个任务(请求)的隔离上下文。
1.12. 日志记录配置参考
构建时修复的配置属性 - 所有其他配置属性可在运行时覆盖
类型 | default | |
root 类别的日志级别,用作所有类别的默认日志级别。 JBoss Logging 支持 Apache 风格的日志级别:
另外,它还支持标准 JDK 日志级别。
环境变量: |
| |
要链接到根类别的额外处理程序的名称。这些处理程序在 consoleHandlers、fileHandlers 或 syslogHandlers 中定义。
环境变量: | 字符串列表 | |
类型 | default | |
如果应该启用控制台日志记录
环境变量: | 布尔值 |
|
如果控制台日志记录应该进入
环境变量: | 布尔值 |
|
日志格式。请注意,如果扩展出现可控制控制台格式(例如,XML 或 JSON 格式扩展)的扩展,则忽略这个值。
环境变量: | string |
|
控制台日志级别。
环境变量: |
| |
指定应分类颜色的数量。请注意,如果扩展出现可控制控制台格式(例如,XML 或 JSON 格式扩展)的扩展,则忽略这个值。
环境变量: | int |
|
要链接到控制台处理程序的过滤器名称。
环境变量: | string | |
指明是否异步登录
环境变量: | 布尔值 |
|
在清除写前使用的队列长度
环境变量: | int |
|
确定在队列满时是否阻止发布者(而不是丢弃消息)
环境变量: |
|
|
类型 | default | |
应该启用文件日志记录
环境变量: | 布尔值 |
|
日志格式
环境变量: | string |
|
要写入文件中的日志级别。
环境变量: |
| |
将写入日志的文件的名称。
环境变量: |
| |
要链接到文件处理程序的过滤器名称。
环境变量: | string | |
使用的字符编码
环境变量: | ||
指明是否异步登录
环境变量: | 布尔值 |
|
在清除写前使用的队列长度
环境变量: | int |
|
确定在队列满时是否阻止发布者(而不是丢弃消息)
环境变量: |
|
|
执行轮转的最大日志文件大小。
环境变量: |
| |
要保留的最大备份数量。
环境变量: | int |
|
文件处理程序轮转文件后缀。使用时,该文件将根据其后缀进行轮转。 fileSuffix 示例:.yyyy-MM-dd 注: 如果后缀以 .zip 或 .gz 结尾,则轮转文件也会被压缩。
环境变量: | string | |
指明是否在服务器初始化中轮转日志文件。
您需要设置
环境变量: | 布尔值 |
|
类型 | default | |
如果应该启用 syslog 日志记录
环境变量: | 布尔值 |
|
Syslog 服务器的 IP 地址和端口
环境变量: | host:port |
|
以 RFC5424 格式格式化消息时使用的应用程序名称
环境变量: | string | |
从发送消息的主机名称
环境变量: | string | |
设置计算 RFC-5424 和 RFC-3164 定义时消息优先级的工具
环境变量: |
|
|
设置
环境变量: |
|
|
设置用于连接 Syslog 服务器的协议
环境变量: |
|
|
如果启用,将发送的消息前缀为消息的大小
环境变量: | 布尔值 |
|
设置为
环境变量: | 布尔值 |
|
尝试重新连接
环境变量: | 布尔值 |
|
日志消息格式
环境变量: | string |
|
指定 Syslog 日志记录器将记录哪些消息级别的日志级别
环境变量: |
| |
要链接到文件处理程序的过滤器名称。
环境变量: | string | |
指明是否异步登录
环境变量: | 布尔值 |
|
在清除写前使用的队列长度
环境变量: | int |
|
确定在队列满时是否阻止发布者(而不是丢弃消息)
环境变量: |
|
|
类型 | default | |
此类别的日志级别。
请注意,若要在
环境变量: | InheritableLevel |
|
要链接到此类别的处理程序的名称。
环境变量: | 字符串列表 | |
指定此日志记录器是否应该将其输出发送到其父 Logger
环境变量: | 布尔值 |
|
类型 | default | |
如果应该启用控制台日志记录
环境变量: | 布尔值 |
|
如果控制台日志记录应该进入
环境变量: | 布尔值 |
|
日志格式。请注意,如果扩展出现可控制控制台格式(例如,XML 或 JSON 格式扩展)的扩展,则忽略这个值。
环境变量: | string |
|
控制台日志级别。
环境变量: |
| |
指定应分类颜色的数量。请注意,如果扩展出现可控制控制台格式(例如,XML 或 JSON 格式扩展)的扩展,则忽略这个值。
环境变量: | int |
|
要链接到控制台处理程序的过滤器名称。
环境变量: | string | |
指明是否异步登录
环境变量: | 布尔值 |
|
在清除写前使用的队列长度
环境变量: | int |
|
确定在队列满时是否阻止发布者(而不是丢弃消息)
环境变量: |
|
|
类型 | default | |
应该启用文件日志记录
环境变量: | 布尔值 |
|
日志格式
环境变量: | string |
|
要写入文件中的日志级别。
环境变量: |
| |
将写入日志的文件的名称。
环境变量: |
| |
要链接到文件处理程序的过滤器名称。
环境变量: | string | |
使用的字符编码
环境变量: | ||
指明是否异步登录
环境变量: | 布尔值 |
|
在清除写前使用的队列长度
环境变量: | int |
|
确定在队列满时是否阻止发布者(而不是丢弃消息)
环境变量: |
|
|
执行轮转的最大日志文件大小。
环境变量: |
| |
要保留的最大备份数量。
环境变量: | int |
|
文件处理程序轮转文件后缀。使用时,该文件将根据其后缀进行轮转。 fileSuffix 示例:.yyyy-MM-dd 注: 如果后缀以 .zip 或 .gz 结尾,则轮转文件也会被压缩。
环境变量: | string | |
指明是否在服务器初始化中轮转日志文件。
您需要设置
环境变量: | 布尔值 |
|
类型 | default | |
如果应该启用 syslog 日志记录
环境变量: | 布尔值 |
|
Syslog 服务器的 IP 地址和端口
环境变量: | host:port |
|
以 RFC5424 格式格式化消息时使用的应用程序名称
环境变量: | string | |
从发送消息的主机名称
环境变量: | string | |
设置计算 RFC-5424 和 RFC-3164 定义时消息优先级的工具
环境变量: |
|
|
设置
环境变量: |
|
|
设置用于连接 Syslog 服务器的协议
环境变量: |
|
|
如果启用,将发送的消息前缀为消息的大小
环境变量: | 布尔值 |
|
设置为
环境变量: | 布尔值 |
|
尝试重新连接
环境变量: | 布尔值 |
|
日志消息格式
环境变量: | string |
|
指定 Syslog 日志记录器将记录哪些消息级别的日志级别
环境变量: |
| |
要链接到文件处理程序的过滤器名称。
环境变量: | string | |
指明是否异步登录
环境变量: | 布尔值 |
|
在清除写前使用的队列长度
环境变量: | int |
|
确定在队列满时是否阻止发布者(而不是丢弃消息)
环境变量: |
|
|
类型 | default | |
要匹配的消息前缀
环境变量: | 字符串列表 |
|
过滤消息的新日志级别。默认为 DEBUG。
环境变量: |
|
一个大小配置选项 recognises 字符串(显示为正则表达式):[ 0-9]+[KkMmGgTtPpEeZzYy]?
.如果未指定后缀,则假定为字节。