日志记录配置
向红帽构建的 Quarkus 文档提供反馈 复制链接链接已复制到粘贴板!
要报告错误或改进文档,请登录您的红帽 JIRA 帐户并提交问题。如果您没有红帽 JIRA 帐户,系统会提示您创建一个帐户。
流程
- 单击以下链接 来创建 ticket。
- 在 Summary 中输入有关此问题的简单描述。
- 在描述中提供问题或增强功能的详细描述。请包括有问题的文档 URL。
- 点 Submit 创建问题并将其路由到适当的文档团队。
第 1 章 日志记录配置 复制链接链接已复制到粘贴板!
阅读红帽构建的 Quarkus 中使用日志 API,配置日志输出,并使用日志记录适配器来统一来自其他日志记录 API 的输出。
本文档是 Observability 参考指南 的一部分,它包括了这个和其他与可观察性相关的组件。
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. 声明 logger 字段 复制链接链接已复制到粘贴板!
使用这个经典方法,您可以使用特定的 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);
public void doSomething() {
log.info("It works!");
}
}
1.2.2. 简化的日志记录 复制链接链接已复制到粘贴板!
Quarkus 简化了日志记录功能,方法是将日志记录器字段添加到使用 io.quarkus.logging.Log 的类中。这消除了重复样板代码的需求,并增强了日志记录设置便利。
使用静态方法调用简化日志的示例:
package com.example;
import io.quarkus.logging.Log;
class MyService {
public void doSomething() {
Log.info("Simple!");
}
}
仅在应用程序类中使用 Log API,而不是在外部依赖项中使用。在 构建时未由 Quarkus 处理的日志方法调用将导致异常。
在扩展中使用 io.quarkus.logging.Log :
虽然 Log API 简化了应用程序类的日志记录,但不建议在扩展模块或外部依赖项中使用。
请考虑以下事项:
-
io.quarkus.logging.Log依赖于构建时发生的 Quarkus 字节代码转换。 在扩展模块中,只有在模块包含 Jandex 索引时,
日志才能正常工作。但是,此行为不受支持,可能会导致不可靠的日志记录。对于扩展开发,请使用
org.jboss.logging.Logger.getLogger (String)而不是io.quarkus.logging.Log。
1.2.3. 注入配置的日志记录器 复制链接链接已复制到粘贴板!
使用 @Inject 注释配置的 org.jboss.logging.Logger 日志记录器实例的注入是添加应用程序日志记录器的替代选择,但仅适用于 CDI Bean。
您可以使用 @Inject Logger 日志,其中日志记录器以您注入的类命名,或使用 @Inject @LoggerName ("…") Logger 日志,其中日志记录器将接收指定的名称。注入后,您可以使用 log 对象来调用日志记录方法。
两种不同类型的日志记录器注入示例:
package com.example;
import org.jboss.logging.Logger;
@ApplicationScoped
class SimpleBean {
@Inject
Logger log;
@LoggerName("foo")
Logger fooLog;
public void ping() {
log.info("Simple!");
fooLog.info("Goes to _foo_ logger!");
}
}
日志记录器实例在内部缓存。因此,当将日志记录器注入 @RequestScoped bean 时,它对所有 bean 实例共享,以避免与日志记录器实例化关联的性能损失。
1.3. 使用日志级别 复制链接链接已复制到粘贴板!
红帽构建的 Quarkus 提供了不同的日志级别,可帮助开发人员控制根据事件严重性记录的信息量。
表 1.1. 可用的日志级别:
| OFF | 配置用于关闭日志记录的特殊级别。 |
| FATAL | 关键服务故障或无法处理任何请求。 |
| ERROR | 处理或无法完成请求的主要问题。 |
| WARN | 一个不需要立即更正的非关键服务错误或问题。 |
| INFO | 服务生命周期事件或其他重要不常的信息。 |
| DEBUG | 有关生命周期事件或未与特定请求关联的事件的附加信息,可用于调试。 |
| TRACE | 根据请求的调试信息详细,可能会非常高。 |
| ALL | 一个特殊的级别,用于为所有消息打开日志记录,包括自定义级别。 |
您还可以为使用 java.util.logging 的应用程序和库配置以下级别:
| 严重 | 与 ERROR 相同。 |
| WARNING | 与 WARN 相同。 |
| CONFIG | 服务配置信息。 |
| 正常的 | 与 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 | 正常的 |
| 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
这会设置一个 floor 级别,用于 Quarkus 需要生成支持代码。构建时必须设置最小日志级别,以便 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=con,mylog
quarkus.log.handler.console.con.enable=true
quarkus.log.handler.file.mylog.enable=true
在本例中,根类别配置为使用两个命名的处理程序: con 和 mylog。
例 1.2. 每个类别配置示例:
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 中配置最小日志级别。
如需更多信息,请参阅 日志记录配置参考。
如果要为特定类别配置额外的内容,请创建一个名为 handler,如 quarkus.log.handler.[console|file|syslog].<your-handler-name> unset,并使用 quarkus.log.category.<my-category>.handlers 进行设置。
用例示例可能需要为日志消息使用不同的时间戳格式,这些消息被保存到一个文件,而不是用于其他处理程序的格式。
有关更多演示,请参阅 将指定 处理程序的输出附加到类别 示例。
| 属性名称 | default | 描述 |
|---|---|---|
|
|
|
用于配置名为 < |
|
|
|
用于配置名为 < |
|
|
| 指定此日志记录器是否应该将其输出发送到其父日志记录器。 |
|
|
| 要附加到特定类别的处理程序的名称。 |
[a]
有些扩展可能会为某些类别定义自定义的默认日志级别,以默认减少日志通知。在配置中设置日志级别将覆盖任何扩展定义的日志级别。
[b]
默认情况下,配置的类别获得与根日志记录器上连接的相同处理程序。
| ||
. 符号分隔配置属性中的特定部分。属性名称中的 quotes 用作保留类别规格所需的转义,如 quarkus.log.category."io.quarkus.smallrye.jwt".level=TRACE, 完整。
1.4.2. 根日志记录器配置 复制链接链接已复制到粘贴板!
根日志记录器类别单独处理,并使用以下属性进行配置:
| 属性名称 | default | 描述 |
|---|---|---|
|
|
| 每个日志类别的默认日志级别。 |
|
|
| 每个日志类别的默认最小日志级别。 |
- 如果给定日志记录器类别没有级别配置,则会检查父类别。
- 如果没有为类别和任何父类别提供特定配置,则使用根日志记录器配置。
虽然根日志记录器的处理程序通常通过 quarkus.log.console、quarkus.log.file 和 quarkus.log.syslog 直接配置,但它可以使用 quarkus.log.handlers 属性为其附加额外的命名处理程序。
1.5. 日志记录格式 复制链接链接已复制到粘贴板!
红帽构建的 Quarkus 使用基于模式的日志格式程序,默认生成人类可读的文本日志,但您也可以使用 dedicated 属性为每个日志处理程序配置格式。
对于 console 处理程序,属性为 quarkus.log.console.format。
日志记录格式字符串支持以下符号:
| 符号 | Summary | 描述 |
|---|---|---|
|
|
|
呈现简单的 |
|
| 类别 | 呈现类别名称。 |
|
| 源类 | 呈现源类名称。[a] |
|
| Date |
使用给定日期格式字符串呈现日期,它使用 |
|
| 例外 | 呈现抛出的异常(若有)。 |
|
| 源文件 | 呈现源文件名。[a] |
|
| 主机名 | 呈现系统简单主机名。 |
|
| 限定主机名 | 呈现系统的完全限定主机名,这可能与简单的主机名相同,具体取决于操作系统配置。 |
|
| 进程 ID | 呈现当前进程 PID。 |
|
| 源位置 | 呈现源位置信息,其中包括源文件名、行号、类名称和方法名称。[a] |
|
| 源行 | 呈现源行号。[a] |
|
| 完整消息 | 呈现日志消息加上异常(如果有)。 |
|
| 源方法 | 呈现源方法名称。[a] |
|
| 换行符 | 呈现特定于平台的行分隔符字符串。 |
|
| 进程名称 | 呈现当前进程的名称。 |
|
| 级别 | 呈现消息的日志级别。 |
|
| 相对时间 | 从应用程序日志开始后,呈现时间(毫秒)。 |
|
| 简单消息 | 仅呈现日志消息,没有异常追踪。 |
|
| 线程名称 | 呈现线程名称。 |
|
| 线程 ID | 呈现线程 ID。 |
|
| 时区 |
将输出的时区设置为 < |
|
| 映射的诊断上下文值 | 呈现映射诊断上下文中的值。 |
|
| 映射的诊断上下文值 |
以 |
|
| 嵌套诊断上下文值 |
以 |
[a]
格式检查调用者信息可能会影响性能的序列
| ||
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 日志记录(结构化)。这可以通过使用不同的配置文件来实现,如以下配置中所示。
在 application.properties 中为 dev 和 test 模式禁用 JSON 日志记录:
%dev.quarkus.log.console.json.enabled=false %test.quarkus.log.console.json.enabled=false
1.5.1.1.1. 配置 复制链接链接已复制到粘贴板!
使用支持的属性配置 JSON 日志记录扩展,以自定义其行为。
build 时修复的 - 配置属性在构建时修复 - 所有其他配置属性在运行时可覆盖
| 配置属性 | Type | default |
| Type | default | |
|
确定是否启用 JSON 控制台格式化扩展,该扩展将禁用"常规"控制台格式。
环境变量: | 布尔值 | |
|
启用 JSON 记录的"pretty 打印"。请注意,有些 JSON 解析器将无法读取用户打印的输出。
环境变量: | 布尔值 |
|
|
要使用的日期格式。特殊字符串 "default" 表示应使用默认格式。
环境变量: | string |
|
|
要使用的特殊记录分隔符。默认情况下使用 newline。
环境变量: | string | |
|
要使用的区域 ID。特殊字符串 "default" 表示应使用默认区域。
环境变量: | string |
|
|
要指定的异常输出类型。
环境变量: |
|
|
|
在日志中可以打印更多详细信息。 打印详细信息可能会昂贵,因为值是从调用者检索的。详情包括源类名称、源文件名、源方法名称和源行号。
环境变量: | 布尔值 |
|
|
使用自定义值覆盖键。省略这个值表示不会应用密钥覆盖。
环境变量: | string | |
|
在 JSON 输出中排除的键。
环境变量: | 字符串列表 | |
|
其他字段值。
环境变量: | string | 所需的 HEKETI Required |
|
其他字段类型规格。支持的类型:
环境变量: |
|
|
|
指定生成的 JSON 的格式
环境变量: |
|
|
| Type | default | |
|
确定是否启用 JSON 控制台格式化扩展,该扩展将禁用"常规"控制台格式。
环境变量: | 布尔值 | |
|
启用 JSON 记录的"pretty 打印"。请注意,有些 JSON 解析器将无法读取用户打印的输出。
环境变量: | 布尔值 |
|
|
要使用的日期格式。特殊字符串 "default" 表示应使用默认格式。
环境变量: | string |
|
|
要使用的特殊记录分隔符。默认情况下使用 newline。
环境变量: | string | |
|
要使用的区域 ID。特殊字符串 "default" 表示应使用默认区域。
环境变量: | string |
|
|
要指定的异常输出类型。
环境变量: |
|
|
|
在日志中可以打印更多详细信息。 打印详细信息可能会昂贵,因为值是从调用者检索的。详情包括源类名称、源文件名、源方法名称和源行号。
环境变量: | 布尔值 |
|
|
使用自定义值覆盖键。省略这个值表示不会应用密钥覆盖。
环境变量: | string | |
|
在 JSON 输出中排除的键。
环境变量: | 字符串列表 | |
|
其他字段值。
环境变量: | string | 所需的 HEKETI Required |
|
其他字段类型规格。支持的类型:
环境变量 : |
|
|
|
指定生成的 JSON 的格式
环境变量: |
|
|
| Type | default | |
|
确定是否启用 JSON 控制台格式化扩展,该扩展将禁用"常规"控制台格式。
环境变量: | 布尔值 | |
|
启用 JSON 记录的"pretty 打印"。请注意,有些 JSON 解析器将无法读取用户打印的输出。
环境变量: | 布尔值 |
|
|
要使用的日期格式。特殊字符串 "default" 表示应使用默认格式。
环境变量: | string |
|
|
要使用的特殊记录分隔符。默认情况下使用 newline。
环境变量: | string | |
|
要使用的区域 ID。特殊字符串 "default" 表示应使用默认区域。
环境变量: | string |
|
|
要指定的异常输出类型。
环境变量: |
|
|
|
在日志中可以打印更多详细信息。 打印详细信息可能会昂贵,因为值是从调用者检索的。详情包括源类名称、源文件名、源方法名称和源行号。
环境变量: | 布尔值 |
|
|
使用自定义值覆盖键。省略这个值表示不会应用密钥覆盖。
环境变量: | string | |
|
在 JSON 输出中排除的键。
环境变量: | 字符串列表 | |
|
其他字段值。
环境变量: | string | 所需的 HEKETI Required |
|
其他字段类型规格。支持的类型:
环境变量: |
|
|
|
指定生成的 JSON 的格式
环境变量: |
|
|
| Type | default | |
|
确定是否启用 JSON 控制台格式化扩展,该扩展将禁用"常规"控制台格式。
环境变量: | 布尔值 | |
|
启用 JSON 记录的"pretty 打印"。请注意,有些 JSON 解析器将无法读取用户打印的输出。
环境变量: | 布尔值 |
|
|
要使用的日期格式。特殊字符串 "default" 表示应使用默认格式。
环境变量: | string |
|
|
要使用的特殊记录分隔符。默认情况下使用 newline。
环境变量: | string | |
|
要使用的区域 ID。特殊字符串 "default" 表示应使用默认区域。
环境变量: | string |
|
|
要指定的异常输出类型。
环境变量: |
|
|
|
在日志中可以打印更多详细信息。 打印详细信息可能会昂贵,因为值是从调用者检索的。详情包括源类名称、源文件名、源方法名称和源行号。
环境变量: | 布尔值 |
|
|
使用自定义值覆盖键。省略这个值表示不会应用密钥覆盖。
环境变量: | string | |
|
在 JSON 输出中排除的键。
环境变量: | 字符串列表 | |
|
其他字段值。
环境变量: | string | 所需的 HEKETI Required |
|
其他字段类型规格。支持的类型:
环境变量: |
|
|
|
指定生成的 JSON 的格式
环境变量: |
|
|
启用用户进行打印可能会导致某些处理器和 JSON 解析器失败。
打印详细信息可能会昂贵,因为值是从调用者检索的。详情包括源类名称、源文件名、源方法名称和源行号。
1.6. 日志处理程序 复制链接链接已复制到粘贴板!
日志处理程序是一个日志组件,负责将日志事件提交到接收者。红帽构建的 Quarkus 包括几个不同的日志处理程序: console、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每个类别配置示例:
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每个类别配置示例:
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 log handler 复制链接链接已复制到粘贴板!
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每个类别配置示例:
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.6.4. 套接字日志处理程序 复制链接链接已复制到粘贴板!
此处理程序将日志发送到套接字。套接字日志处理程序默认为禁用;使其能够使用它。启用后,它会将所有日志事件发送到套接字,如 Logstash 服务器。
全局配置示例:
quarkus.log.socket.enable=true quarkus.log.socket.endpoint=localhost:4560
通常,此处理程序与 quarkus-logging-json 扩展一起使用,将 ECS 格式的日志发送到 Elasticsearch 实例。有关示例配置,请参阅 集中日志管理指南。
1.7. 在您的日志处理程序中添加日志记录过滤器 复制链接链接已复制到粘贴板!
日志处理程序(如控制台日志处理程序)可以与决定是否应记录日志 的过滤器 相关联。
注册日志记录过滤器:
注解一个
最终类,它使用@io.quarkus.logging.LoggingFilter实现java.util.logging.Filter,并设置name属性:编写过滤器的示例:
package com.example; 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. 日志记录配置示例 复制链接链接已复制到粘贴板!
以下示例演示了您可以在 Red Hat build of Quarkus 中配置日志记录的一些方法:
除 Quarkus 日志(INFO)外的控制台 DEBUG 日志记录,无颜色、缩短时间、缩短类别前缀
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
如果您在命令行中添加这些属性,请确保 " 被转义。例如,-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.9.1. OpenTelemetry 日志记录 复制链接链接已复制到粘贴板!
所有附加器中的日志条目都可以使用 OpenTelemetry Logging 发送。
详情请参阅 Quarkus OpenTelemetry Logging 指南。
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>
<quarkus.log.level>DEBUG</quarkus.log.level>
<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 会覆盖日志记录映射的 diagnostics Context (MDC),以改进与其被动内核的兼容性。
1.11.2.1. 添加和读取 MDC 数据 复制链接链接已复制到粘贴板!
要在 MDC 中添加数据,并将其提取到日志输出中:
使用
MDC类设置数据。-
添加
导入 org.jboss.logmanager.MDC; 设置
MDC.put (…),如下例所示: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!"; } }
-
添加
将日志格式配置为使用
%X{mdc-key}: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 类之一:
-
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 传播 复制链接链接已复制到粘贴板!
在 Quarkus 中,MDC 供应商具有处理被动上下文的特定实现,确保在被动和异步处理过程中传播 MDC 数据。
因此,您仍可在各种情况下访问 MDC 数据:
- 异步调用后,例如,当 REST 客户端返回 Uni 时。
-
在提交到
org.eclipse.microprofile.context.ManagedExecutor的代码中。 -
在使用
vertx.executeBlocking ()执行的代码中。
如果适用,MDC 数据存储在 重复的上下文中,后者是处理单个任务或请求的隔离上下文。
1.12. 日志记录配置参考 复制链接链接已复制到粘贴板!
build 时修复的 - 配置属性在构建时修复 - 所有其他配置属性在运行时可覆盖
| 配置属性 | 类型 | default |
|
build 时修复的 如果启用并存在指标扩展,则会发布日志记录指标。
环境变量: | 布尔值 |
|
|
在构建时间 quarkus.log.min-level] 默认最小日志级别。
环境变量: |
| |
|
在构建时修复了 这将分解 dev 模式的 stacktrace,以显示导致异常的代码中的行
环境变量: | 布尔值 |
|
|
根类别的日志级别,用作所有类别的默认日志级别。<p> JBoss Logging 支持 Apache 风格的日志级别:<p> * {@link org.jboss.logmanager.Level migrationAL} * {@link org.jboss.logmanager.Level:ERROR} * {@link org.jboss.logmanager.Level45WARN} * {@link org.jboss.logmanager.Level#INFO} * {@link org.jboss.logmanager.Level""DEBUG} * {@link org.jboss.logmanager.Level45TRACE} 另外,它还支持标准的 JDK 日志级别。
环境变量: |
| |
|
要链接到根类别的其他处理程序的名称。这些处理程序在 consoleHandlers、fileHandlers 或 syslogHandlers 中定义。
环境变量: | 字符串列表 | |
| 类型 | default | |
|
在构建时修复了
此类别的最小日志级别。默认情况下,所有类别都配置为
若要获取
例如,若要获取
环境变量: | InheritableLevel |
|
|
此类别的日志级别。
请注意,若要获取
环境变量: | InheritableLevel |
|
|
要链接到此类别的处理程序的名称。
环境变量: | 字符串列表 | |
|
指定此日志记录器是否应该将其输出发送到其父 Logger
环境变量: | 布尔值 |
|
| 类型 | default | |
|
如果应该启用控制台日志记录
环境变量: | 布尔值 |
|
|
如果控制台日志记录应该进入
环境变量: | 布尔值 |
|
|
日志格式。请注意,如果扩展存在控制控制台格式的扩展(如 XML 或 JSON 格式的扩展),则此值将被忽略。
环境变量: | string |
|
|
控制台日志级别。
环境变量: |
| |
|
指定颜色应隐藏的数量。请注意,如果扩展存在控制控制台格式的扩展(如 XML 或 JSON 格式的扩展),则此值将被忽略。
环境变量: | int |
|
|
链接到控制台处理程序的过滤器的名称。
环境变量: | string | |
|
指明是否异步记录
环境变量: | 布尔值 |
|
|
刷新写入前使用的队列长度
环境变量: | int |
|
|
确定在队列满时是否阻止发布者(而不是丢弃消息)
环境变量: |
|
|
| 类型 | default | |
|
如果应该启用文件日志记录
环境变量: | 布尔值 |
|
|
日志格式
环境变量: | string |
|
|
要写入文件的日志级别。
环境变量: |
| |
|
将在其中写入日志的文件名。
环境变量: |
| |
|
要链接到文件处理程序的过滤器的名称。
环境变量: | string | |
|
使用的字符编码
环境变量: | ||
|
指明是否异步记录
环境变量: | 布尔值 |
|
|
刷新写入前使用的队列长度
环境变量: | int |
|
|
确定在队列满时是否阻止发布者(而不是丢弃消息)
环境变量: |
|
|
|
是否启用日志轮转。
环境变量: | 布尔值 |
|
|
执行轮转后的最大日志文件大小。请注意,在写入日志记录 后,该文件会被轮转。因此,这并不是文件大小硬最大,而是在轮转文件前,对文件的大小进行硬性。
环境变量: | MemorySize HEKETI MemorySize 格式 |
|
|
要保留的最大备份数。
环境变量: | int |
|
|
文件处理程序轮转文件后缀。使用时,该文件将根据后缀进行轮转。
后缀必须采用 date-time 格式,它可以被 示例 fileSuffix: .yyyy-MM-dd 注: 如果后缀以 .zip 或 .gz 结尾,则轮转文件也会被压缩。
环境变量: | string | |
|
指明是否在服务器初始化时轮转日志文件。
您需要设置
环境变量: | 布尔值 |
|
| 类型 | default | |
|
如果应启用 syslog 日志记录
环境变量: | 布尔值 |
|
|
Syslog 服务器的 IP 地址和端口
环境变量: | host:port |
|
|
使用 RFC5424 格式格式化消息时使用的应用程序名称
环境变量: | string | |
|
从其中发送消息的主机的名称
环境变量: | string | |
|
设置计算 RFC-5424 和 RFC-3164 定义的消息优先级时使用的工具
环境变量: |
|
|
|
设置
环境变量: |
|
|
|
设置用于连接 Syslog 服务器的协议
环境变量: |
|
|
|
如果启用,则发送的消息将以消息的大小作为前缀
环境变量: | 布尔值 |
|
|
设置为
环境变量: | 布尔值 |
|
|
启用或禁用在尝试重新连接
环境变量: | 布尔值 |
|
|
日志消息格式
环境变量: | string |
|
|
指定 Syslog 日志记录器记录哪些消息级别的日志级别
环境变量: |
| |
|
要链接到文件处理程序的过滤器的名称。
环境变量: | string | |
|
允许发送的消息的最大长度(以字节为单位)。长度包括标头和消息。
如果没有设置,当 sys-log-type 为
环境变量: | MemorySize HEKETI MemorySize 格式 | |
|
指明是否异步记录
环境变量: | 布尔值 |
|
|
刷新写入前使用的队列长度
环境变量: | int |
|
|
确定在队列满时是否阻止发布者(而不是丢弃消息)
环境变量: |
|
|
| 类型 | default | |
|
如果应该启用套接字日志记录
环境变量: | 布尔值 |
|
|
接收日志的服务器的 IP 地址和端口
环境变量: | host:port |
|
|
设置用于连接 syslog 服务器的协议
环境变量: |
|
|
|
启用或禁用在尝试重新连接
环境变量: | 布尔值 |
|
|
日志消息格式
环境变量: | string |
|
|
指定日志级别,由套接字日志记录器记录哪些消息级别
环境变量: |
| |
|
要链接到文件处理程序的过滤器的名称。
环境变量: | string | |
|
指明是否异步记录
环境变量: | 布尔值 |
|
|
刷新写入前使用的队列长度
环境变量: | int |
|
|
确定在队列满时是否阻止发布者(而不是丢弃消息)
环境变量: |
|
|
| 类型 | default | |
|
如果应该启用控制台日志记录
环境变量: | 布尔值 |
|
|
如果控制台日志记录应该进入
环境变量: | 布尔值 |
|
|
日志格式。请注意,如果扩展存在控制控制台格式的扩展(如 XML 或 JSON 格式的扩展),则此值将被忽略。
环境变量: | string |
|
|
控制台日志级别。
环境变量: |
| |
|
指定颜色应隐藏的数量。请注意,如果扩展存在控制控制台格式的扩展(如 XML 或 JSON 格式的扩展),则此值将被忽略。
环境变量: | int |
|
|
链接到控制台处理程序的过滤器的名称。
环境变量: | string | |
|
指明是否异步记录
环境变量: | 布尔值 |
|
|
刷新写入前使用的队列长度
环境变量: | int |
|
|
确定在队列满时是否阻止发布者(而不是丢弃消息)
环境变量: |
|
|
| 类型 | default | |
|
如果应该启用文件日志记录
环境变量: | 布尔值 |
|
|
日志格式
环境变量: | string |
|
|
要写入文件的日志级别。
环境变量: |
| |
|
将在其中写入日志的文件名。
环境变量: |
| |
|
要链接到文件处理程序的过滤器的名称。
环境变量: | string | |
|
使用的字符编码
环境变量: | ||
|
指明是否异步记录
环境变量: | 布尔值 |
|
|
刷新写入前使用的队列长度
环境变量: | int |
|
|
确定在队列满时是否阻止发布者(而不是丢弃消息)
环境变量: |
|
|
|
是否启用日志轮转。
环境变量: | 布尔值 |
|
|
执行轮转后的最大日志文件大小。请注意,在写入日志记录 后,该文件会被轮转。因此,这并不是文件大小硬最大,而是在轮转文件前,对文件的大小进行硬性。
环境变量: | MemorySize HEKETI MemorySize 格式 |
|
|
要保留的最大备份数。
环境变量: | int |
|
|
文件处理程序轮转文件后缀。使用时,该文件将根据后缀进行轮转。
后缀必须采用 date-time 格式,它可以被 示例 fileSuffix: .yyyy-MM-dd 注: 如果后缀以 .zip 或 .gz 结尾,则轮转文件也会被压缩。
环境变量: | string | |
|
指明是否在服务器初始化时轮转日志文件。
您需要设置
环境变量: | 布尔值 |
|
| 类型 | default | |
|
如果应启用 syslog 日志记录
环境变量: | 布尔值 |
|
|
Syslog 服务器的 IP 地址和端口
环境变量: | host:port |
|
|
使用 RFC5424 格式格式化消息时使用的应用程序名称
环境变量: | string | |
|
从其中发送消息的主机的名称
环境变量: | string | |
|
设置计算 RFC-5424 和 RFC-3164 定义的消息优先级时使用的工具
环境变量: |
|
|
|
设置
环境变量: |
|
|
|
设置用于连接 Syslog 服务器的协议
环境变量: |
|
|
|
如果启用,则发送的消息将以消息的大小作为前缀
环境变量: | 布尔值 |
|
|
设置为
环境变量: | 布尔值 |
|
|
启用或禁用在尝试重新连接
环境变量: | 布尔值 |
|
|
日志消息格式
环境变量: | string |
|
|
指定 Syslog 日志记录器记录哪些消息级别的日志级别
环境变量: |
| |
|
要链接到文件处理程序的过滤器的名称。
环境变量: | string | |
|
允许发送的消息的最大长度(以字节为单位)。长度包括标头和消息。
如果没有设置,当 sys-log-type 为
环境变量: | MemorySize HEKETI MemorySize 格式 | |
|
指明是否异步记录
环境变量: | 布尔值 |
|
|
刷新写入前使用的队列长度
环境变量: | int |
|
|
确定在队列满时是否阻止发布者(而不是丢弃消息)
环境变量: |
|
|
| 类型 | default | |
|
如果应该启用套接字日志记录
环境变量: | 布尔值 |
|
|
接收日志的服务器的 IP 地址和端口
环境变量: | host:port |
|
|
设置用于连接 syslog 服务器的协议
环境变量: |
|
|
|
启用或禁用在尝试重新连接
环境变量: | 布尔值 |
|
|
日志消息格式
环境变量: | string |
|
|
指定日志级别,由套接字日志记录器记录哪些消息级别
环境变量: |
| |
|
要链接到文件处理程序的过滤器的名称。
环境变量: | string | |
|
指明是否异步记录
环境变量: | 布尔值 |
|
|
刷新写入前使用的队列长度
环境变量: | int |
|
|
确定在队列满时是否阻止发布者(而不是丢弃消息)
环境变量: |
|
|
| 类型 | default | |
|
要匹配的消息前缀
环境变量: | 字符串列表 |
|
|
过滤的消息的新日志级别。默认值为 DEBUG。
环境变量: |
|
大小配置选项以这种格式识别字符串(显示为正则表达式): [0-9]+[KkMmGgTtPpEeZzYy]?.
如果未指定后缀,则假定为字节。