日志配置
了解在 Quarkus 中使用日志 API、配置日志输出以及使用日志适配器统一来自其他日志 API 的输出。
本文档是 Quarkus 可观察性参考指南的一部分,该指南介绍了此组件和其他可观察性相关组件。
Quarkus 使用 JBoss Log Manager 日志后端来发布应用程序和框架日志。Quarkus 支持 JBoss Logging API 和多个其他日志 API,它们与 JBoss Log Manager 无缝集成。您可以使用任何以下 API
使用 JBoss Logging 进行应用程序日志记录
使用 JBoss Logging API 时,您的应用程序不需要额外的依赖项,因为 Quarkus 会自动提供它。
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。 |
获取应用程序记录器
要在 Quarkus 中获取应用程序记录器,请选择以下方法之一。
声明记录器字段
使用这种经典方法,您可以使用特定的 API 来获取记录器实例,将其存储在类的静态字段中,并在该实例上调用日志记录操作。
相同的流程可以应用于任何支持的日志 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 | 在 log 对象上调用所需的日志记录方法。 |
简化的日志记录
Quarkus 通过自动向使用 io.quarkus.logging.Log
的类添加记录器字段来简化日志记录。这消除了对重复样板代码的需求,并增强了日志记录设置的便利性。
package com.example;
import io.quarkus.logging.Log; (1)
class MyService { (2)
public void doSomething() {
Log.info("Simple!"); (3)
}
}
1 | io.quarkus.logging.Log 类包含与 JBoss Logging 相同的方法,只是它们是 static 。 |
2 | 请注意,该类没有声明记录器字段。这是因为在应用程序构建期间,会在每个使用 Log API 的类中自动创建一个 private static final org.jboss.logging.Logger 字段。调用 Log 方法的类的完全限定名称用作记录器名称。在此示例中,记录器名称将为 com.example.MyService 。 |
3 | 最后,所有对 Log 方法的调用在应用程序构建期间都会被重写为记录器字段上的常规 JBoss Logging 调用。 |
仅在应用程序类中使用 在扩展中使用
io.quarkus.logging.Log 虽然 以下注意事项适用
|
注入配置的记录器
使用 @Inject
注释注入配置的 org.jboss.logging.Logger
记录器实例是添加应用程序记录器的另一种方法,但仅适用于 CDI bean。
您可以使用 @Inject Logger log
,其中记录器以您注入它的类命名,或者使用 @LoggerName("…") Logger log
,其中记录器将收到指定的名称。请注意,如果您已经使用 @LoggerName("…")
注释了您的 Logger
,则不需要 @Inject
。
一旦注入,您就可以使用 log
对象来调用日志记录方法。
package com.example;
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!");
}
}
1 | 声明类的完全限定类名 (FQCN) 用作记录器名称,例如,将使用 org.jboss.logging.Logger.getLogger(SimpleBean.class) 。 |
2 | 在这种情况下,名称 *foo* 用作记录器名称,例如,将使用 org.jboss.logging.Logger.getLogger("foo") 。 |
记录器实例在内部缓存。因此,当记录器被注入到例如 |
使用日志级别
Quarkus 提供了不同的日志级别,这有助于开发人员根据事件的严重性来控制记录的信息量。
OFF |
一种特殊级别,用于在配置中关闭日志记录。 |
FATAL |
严重的服务故障或完全无法处理任何请求。 |
ERROR |
处理中的主要问题或无法完成请求。 |
WARN |
非严重的服务错误或可能不需要立即纠正的问题。 |
INFO |
服务生命周期事件或其他重要的不频繁信息。 |
DEBUG |
有关生命周期事件或其他与特定请求无关的事件的其他信息,对调试很有用。 |
TRACE |
详细的每个请求的调试信息,可能具有非常高的频率。 |
ALL |
一种特殊级别,用于打开所有消息的日志记录,包括自定义级别。 |
您还可以为使用 java.util.logging
的应用程序和库配置以下级别
SEVERE |
与 ERROR 相同。 |
WARNING |
与 WARN 相同。 |
CONFIG |
服务配置信息。 |
FINE |
与 DEBUG 相同。 |
FINER |
与 TRACE 相同。 |
FINEST |
与 |
数值级别值 | 标准级别名称 | 等效的 java.util.logging (JUL) 级别名称 |
---|---|---|
1100 |
FATAL |
不适用 |
1000 |
ERROR |
SEVERE |
900 |
WARN |
WARNING |
800 |
INFO |
INFO |
700 |
不适用 |
CONFIG |
500 |
DEBUG |
FINE |
400 |
TRACE |
FINER |
300 |
不适用 |
FINEST |
配置日志级别、类别和格式
集成到 Quarkus 中的 JBoss Logging 通过单个配置文件为所有支持的日志 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 需要生成支持代码的级别设置一个下限。必须在构建时设置最小日志级别,以便 Quarkus 可以打开优化机会的大门,在这些机会中,可以省略不可用级别上的日志记录。
将 INFO
设置为最小日志记录级别会将较低级别的检查(例如 isTraceEnabled
)设置为 false
。这将标识永远不会执行的代码,例如 if(logger.isDebug()) callMethod();
,并将其标记为“死代码”。
如果您在命令行上添加这些属性,请确保正确转义 -Dquarkus.log.category.\"org.hibernate\".level=TRACE |
所有可能的属性都在日志配置参考部分中列出。
日志类别
日志记录是按类别配置的,每个类别都是独立配置的。类别的配置以递归方式应用于所有子类别,除非存在更具体的子类别配置。
所有日志类别的父类别称为“根类别”。作为最终父类别,此类别可能包含全局应用于所有其他类别的配置。这包括全局配置的处理程序和格式化程序。
quarkus.log.handlers=con,mylog
quarkus.log.handler.console.con.enable=true
quarkus.log.handler.file.mylog.enable=true
在此示例中,根类别配置为使用两个命名的处理程序:con
和 mylog
。
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
为该类别设置它。
一个用例可能是希望为保存到文件的日志消息使用与其他处理程序使用的格式不同的时间戳格式。
有关进一步演示,请参见将命名处理程序附加到类别示例的输出。
属性名称 | 默认 | 描述 |
---|---|---|
|
|
用于配置名为 |
|
|
用于配置名为 |
|
|
指定此记录器是否应将其输出发送到其父记录器。 |
|
|
您要附加到特定类别的处理程序的名称。 |
|
根记录器配置
根记录器类别是单独处理的,并使用以下属性进行配置
属性名称 | 默认 | 描述 |
---|---|---|
|
|
每个日志类别的默认日志级别。 |
|
|
每个日志类别的默认最小日志级别。 |
-
如果给定记录器类别不存在级别配置,则会检查父类别。
-
如果没有为类别及其任何父类别提供特定的配置,则使用根记录器配置。
虽然根记录器的处理程序通常通过 |
日志格式
Quarkus 使用基于模式的日志格式化程序,默认情况下生成人类可读的文本日志,但您也可以使用专用属性为每个日志处理程序配置格式。
对于控制台处理程序,该属性是 quarkus.log.console.format
。
日志格式字符串支持以下符号
符号 | 摘要 | 描述 |
---|---|---|
|
|
呈现一个简单的 |
|
类别 |
呈现类别名称。 |
|
源类 |
呈现源类名称。[3] |
|
日期 |
呈现具有给定日期格式字符串的日期,该字符串使用 |
|
异常 |
呈现抛出的异常(如果有)。 |
|
源文件 |
呈现源文件名。[3] |
|
主机名 |
呈现系统简单主机名。 |
|
完全限定的主机名 |
呈现系统的完全限定主机名,根据操作系统配置,该名称可能与简单主机名相同。 |
|
进程 ID |
呈现当前进程 PID。 |
|
源位置 |
呈现源位置信息,包括源文件名、行号、类名和方法名。[3] |
|
源行 |
呈现源行号。[3] |
|
完整消息 |
呈现日志消息和异常(如果有)。 |
|
源方法 |
呈现源方法名。[3] |
|
换行符 |
呈现特定于平台的行分隔符字符串。 |
|
进程名称 |
呈现当前进程的名称。 |
|
级别 |
呈现消息的日志级别。 |
|
相对时间 |
呈现自应用程序日志启动以来的时间(以毫秒为单位)。 |
|
简单消息 |
仅呈现日志消息,不包含异常跟踪。 |
|
线程名称 |
呈现线程名称。 |
|
线程 ID |
呈现线程 ID。 |
|
时区 |
将输出的时区设置为 |
|
映射诊断上下文值 |
呈现来自映射诊断上下文的值。 |
|
映射诊断上下文值 |
以 |
|
嵌套诊断上下文值 |
以 |
备用控制台日志格式
更改控制台日志格式很有用,例如,当 Quarkus 应用程序的控制台输出被服务捕获时,该服务会处理和存储日志信息以供以后分析。
JSON 日志格式
可以使用 quarkus-logging-json
扩展来添加对 JSON 日志格式及其相关配置的支持。
-
将此扩展添加到您的构建文件中,如下面的代码片段所示
pom.xml<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-logging-json</artifactId> </dependency>
build.gradleimplementation("io.quarkus:quarkus-logging-json")
默认情况下,此扩展的存在会替换控制台配置中的输出格式配置,并且格式字符串和颜色设置(如果有)将被忽略。其他控制台配置项(包括控制异步日志记录和日志级别的配置项)将继续应用。
对于某些人来说,在开发模式下使用人类可读的(非结构化)日志记录,并在生产模式下使用 JSON 日志记录(结构化)是有意义的。可以使用不同的配置文件来实现此目的,如下面的配置所示。
-
在 application.properties 中禁用开发和测试模式下的 JSON 日志记录
%dev.quarkus.log.console.json.enabled=false %test.quarkus.log.console.json.enabled=false
配置
使用支持的属性配置 JSON 日志记录扩展以自定义其行为。
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
配置属性 |
类型 |
默认 |
---|---|---|
类型 |
默认 |
|
确定是否启用 JSON 控制台格式化扩展,该扩展禁用“普通”控制台格式化。 环境变量: 显示更多 |
布尔值 |
|
启用 JSON 记录的“漂亮打印”。请注意,某些 JSON 解析器将无法读取漂亮打印的输出。 环境变量: 显示更多 |
布尔值 |
|
要使用的日期格式。特殊字符串“default”表示应使用默认格式。 环境变量: 显示更多 |
字符串 |
|
要使用的特殊记录结束分隔符。默认情况下,使用换行符。 环境变量: 显示更多 |
字符串 |
|
要使用的区域 ID。特殊字符串“default”表示应使用默认区域。 环境变量: 显示更多 |
字符串 |
|
要指定的异常输出类型。 环境变量: 显示更多 |
|
|
启用在日志中打印更多详细信息。 打印详细信息可能很昂贵,因为这些值是从调用者检索的。这些详细信息包括源类名、源文件名、源方法名和源行号。 环境变量: 显示更多 |
布尔值 |
|
使用自定义值覆盖键。省略此值表示将不应用任何键覆盖。 环境变量: 显示更多 |
字符串 |
|
要从 JSON 输出中排除的键。 环境变量: 显示更多 |
字符串列表 |
|
附加字段值。 环境变量: 显示更多 |
字符串 |
必需 |
其他字段类型规范。支持的类型: 环境变量: 显示更多 |
|
|
|
|
|
类型 |
默认 |
|
确定是否启用 JSON 控制台格式化扩展,该扩展禁用“普通”控制台格式化。 环境变量: 显示更多 |
布尔值 |
|
启用 JSON 记录的“漂亮打印”。请注意,某些 JSON 解析器将无法读取漂亮打印的输出。 环境变量: 显示更多 |
布尔值 |
|
要使用的日期格式。特殊字符串“default”表示应使用默认格式。 环境变量: 显示更多 |
字符串 |
|
要使用的特殊记录结束分隔符。默认情况下,使用换行符。 环境变量: 显示更多 |
字符串 |
|
要使用的区域 ID。特殊字符串“default”表示应使用默认区域。 环境变量: 显示更多 |
字符串 |
|
要指定的异常输出类型。 环境变量: 显示更多 |
|
|
启用在日志中打印更多详细信息。 打印详细信息可能很昂贵,因为这些值是从调用者检索的。这些详细信息包括源类名、源文件名、源方法名和源行号。 环境变量: 显示更多 |
布尔值 |
|
使用自定义值覆盖键。省略此值表示将不应用任何键覆盖。 环境变量: 显示更多 |
字符串 |
|
字符串列表 |
||
附加字段值。 环境变量: 显示更多 |
字符串 |
必需 |
其他字段类型规范。支持的类型: 环境变量: 显示更多 |
|
|
|
|
|
类型 |
默认 |
|
确定是否启用 JSON 控制台格式化扩展,该扩展禁用“普通”控制台格式化。 环境变量: 显示更多 |
布尔值 |
|
启用 JSON 记录的“漂亮打印”。请注意,某些 JSON 解析器将无法读取漂亮打印的输出。 环境变量: 显示更多 |
布尔值 |
|
要使用的日期格式。特殊字符串“default”表示应使用默认格式。 环境变量: 显示更多 |
字符串 |
|
要使用的特殊记录结束分隔符。默认情况下,使用换行符。 环境变量: 显示更多 |
字符串 |
|
要使用的区域 ID。特殊字符串“default”表示应使用默认区域。 环境变量: 显示更多 |
字符串 |
|
要指定的异常输出类型。 环境变量: 显示更多 |
|
|
启用在日志中打印更多详细信息。 打印详细信息可能很昂贵,因为这些值是从调用者检索的。这些详细信息包括源类名、源文件名、源方法名和源行号。 环境变量: 显示更多 |
布尔值 |
|
使用自定义值覆盖键。省略此值表示将不应用任何键覆盖。 环境变量: 显示更多 |
字符串 |
|
要从 JSON 输出中排除的键。 环境变量: 显示更多 |
字符串列表 |
|
附加字段值。 环境变量: 显示更多 |
字符串 |
必需 |
其他字段类型规范。支持的类型: 环境变量: 显示更多 |
|
|
|
|
|
类型 |
默认 |
|
确定是否启用 JSON 控制台格式化扩展,该扩展禁用“普通”控制台格式化。 环境变量: 显示更多 |
布尔值 |
|
启用 JSON 记录的“漂亮打印”。请注意,某些 JSON 解析器将无法读取漂亮打印的输出。 环境变量: 显示更多 |
布尔值 |
|
要使用的日期格式。特殊字符串“default”表示应使用默认格式。 环境变量: 显示更多 |
字符串 |
|
要使用的特殊记录结束分隔符。默认情况下,使用换行符。 环境变量: 显示更多 |
字符串 |
|
要使用的区域 ID。特殊字符串“default”表示应使用默认区域。 环境变量: 显示更多 |
字符串 |
|
要指定的异常输出类型。 环境变量: 显示更多 |
|
|
启用在日志中打印更多详细信息。 打印详细信息可能很昂贵,因为这些值是从调用者检索的。这些详细信息包括源类名、源文件名、源方法名和源行号。 环境变量: 显示更多 |
布尔值 |
|
使用自定义值覆盖键。省略此值表示将不应用任何键覆盖。 环境变量: 显示更多 |
字符串 |
|
要从 JSON 输出中排除的键。 环境变量: 显示更多 |
字符串列表 |
|
附加字段值。 环境变量: 显示更多 |
字符串 |
必需 |
其他字段类型规范。支持的类型: 环境变量: 显示更多 |
|
|
|
|
启用漂亮打印可能会导致某些处理器和 JSON 解析器失败。 |
打印详细信息可能很昂贵,因为这些值是从调用者检索的。这些详细信息包括源类名、源文件名、源方法名和源行号。 |
日志处理程序
日志处理程序是负责将日志事件发送给接收者的日志记录组件。Quarkus 包括几个不同的日志处理程序:控制台、文件和 Syslog。
特色示例使用 com.example
作为日志记录类别。
控制台日志处理程序
默认情况下启用控制台日志处理程序,它将所有日志事件定向到应用程序的控制台,通常是系统的 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
有关其配置的详细信息,请参见控制台日志记录配置参考。
文件日志处理程序
要将事件记录到应用程序主机上的文件中,请使用 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
有关其配置的详细信息,请参见文件日志记录配置参考。
Syslog 日志处理程序
默认情况下,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 日志记录配置参考。
套接字日志处理程序
此处理程序将日志发送到套接字。默认情况下禁用套接字日志处理程序;启用它才能使用它。启用后,它会将所有日志事件发送到套接字,例如 Logstash 服务器。
-
全局配置示例
quarkus.log.socket.enable=true quarkus.log.socket.endpoint=localhost:4560
通常,此处理程序与 quarkus-logging-json
扩展一起使用,以 ECS 格式将日志发送到 Elasticsearch 实例。有关配置示例,请参见集中式日志管理指南。
向日志处理程序添加日志过滤器
日志处理程序(例如控制台日志处理程序)可以与过滤器链接,该过滤器确定是否应记录日志记录。
注册日志过滤器
-
使用
@io.quarkus.logging.LoggingFilter
注释实现java.util.logging.Filter
的final
类,并设置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
中的filter
配置属性将过滤器附加到相应的处理程序quarkus.log.console.filter=my-filter
日志配置示例
以下示例显示了在 Quarkus 中配置日志记录的一些方法
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
如果您在命令行中添加这些属性,请确保 |
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
集中式日志管理
使用一个集中的位置,有效地收集、存储和分析来自应用程序的各种组件和实例的日志数据。
要将日志发送到诸如 Graylog、Logstash 或 Fluentd 之类的集中式工具,请参阅 Quarkus 集中式日志管理 指南。
为 @QuarkusTest
配置日志
通过将 java.util.logging.manager
系统属性设置为 org.jboss.logmanager.LogManager
,为 @QuarkusTest
启用正确的日志记录。
系统属性必须尽早设置才能生效,因此建议在构建系统中进行配置。
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>
1 | 确保使用 org.jboss.logmanager.LogManager 。 |
2 | 为所有日志类别启用调试日志记录。 |
对于 Gradle,将以下配置添加到 build.gradle
文件
test {
systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager"
}
另请参见 从 IDE 运行 @QuarkusTest
。
使用其他日志 API
Quarkus 依赖 JBoss Logging 库来满足所有日志记录需求。
假设您使用的库依赖于其他日志库,例如 Apache Commons Logging、Log4j 或 SLF4J。在这种情况下,请将它们从依赖项中排除,并使用 JBoss Logging 适配器之一。
在构建本机可执行文件时,这一点尤其重要,因为在编译本机可执行文件时,您可能会遇到与以下类似的问题
Caused by java.lang.ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl
日志记录实现未包含在本机可执行文件中,但是您可以使用 JBoss Logging 适配器来解决此问题。
这些适配器可用于流行的开源日志记录组件,如下一章所述。
将日志记录适配器添加到您的应用程序
对于每个不是 jboss-logging
的日志 API
-
添加一个日志记录适配器库,以确保通过这些 API 记录的消息被路由到 JBoss Log Manager 后端。
对于 Quarkus 扩展的依赖项库,此步骤是不必要的,因为扩展会自动处理它。 -
Apache Commons Logging
pom.xml<dependency> <groupId>org.jboss.logging</groupId> <artifactId>commons-logging-jboss-logging</artifactId> </dependency>
build.gradleimplementation("org.jboss.logging:commons-logging-jboss-logging")
-
Log4j
pom.xml<dependency> <groupId>org.jboss.logmanager</groupId> <artifactId>log4j-jboss-logmanager</artifactId> </dependency>
build.gradleimplementation("org.jboss.logmanager:log4j-jboss-logmanager")
-
Log4j 2
pom.xml<dependency> <groupId>org.jboss.logmanager</groupId> <artifactId>log4j2-jboss-logmanager</artifactId> </dependency>
build.gradleimplementation("org.jboss.logmanager:log4j2-jboss-logmanager")
不要包含任何 Log4j 依赖项,因为
log4j2-jboss-logmanager
库包含将 Log4j 用作日志记录实现所需的一切。 -
SLF4J
pom.xml<dependency> <groupId>org.jboss.slf4j</groupId> <artifactId>slf4j-jboss-logmanager</artifactId> </dependency>
build.gradleimplementation("org.jboss.slf4j:slf4j-jboss-logmanager")
-
-
验证添加的库生成的日志是否符合与其他 Quarkus 日志相同的格式。
使用 MDC 添加上下文日志信息
Quarkus 覆盖了日志记录映射诊断上下文(MDC),以提高与其反应式核心的兼容性。
添加和读取 MDC 数据
要将数据添加到 MDC 并在日志输出中提取它
-
使用
MDC
类来设置数据。-
添加
import 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
日志配置参考
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
配置属性 |
类型 |
默认 |
---|---|---|
布尔值 |
|
|
|
||
这将在开发模式下修饰堆栈跟踪,以显示导致异常的代码行 环境变量: 显示更多 |
布尔值 |
|
根类别的日志级别,用作所有类别的默认日志级别。<p> JBoss Logging 支持 Apache 样式的日志级别:<p> * {@link org.jboss.logmanager.Level#FATAL} * {@link org.jboss.logmanager.Level#ERROR} * {@link org.jboss.logmanager.Level#WARN} * {@link org.jboss.logmanager.Level#INFO} * {@link org.jboss.logmanager.Level#DEBUG} * {@link org.jboss.logmanager.Level#TRACE} 此外,它还支持标准 JDK 日志级别。 环境变量: 显示更多 |
|
|
要链接到根类别的其他处理程序的名称。这些处理程序在 consoleHandlers、fileHandlers 或 syslogHandlers 中定义。 环境变量: 显示更多 |
字符串列表 |
|
类型 |
默认 |
|
此类别的最低日志级别。默认情况下,所有类别都配置为 要获得低于 例如,要获得 环境变量: 显示更多 |
InheritableLevel |
|
此类别的日志级别。 请注意,要获得低于 环境变量: 显示更多 |
InheritableLevel |
|
要链接到此类别的处理程序的名称。 环境变量: 显示更多 |
字符串列表 |
|
指定此记录器是否应将其输出发送到其父记录器 环境变量: 显示更多 |
布尔值 |
|
类型 |
默认 |
|
布尔值 |
|
|
控制台日志是否应转到 环境变量: 显示更多 |
布尔值 |
|
日志格式。请注意,如果存在控制控制台格式的扩展(例如,XML 或 JSON 格式扩展),则将忽略此值。 环境变量: 显示更多 |
字符串 |
|
|
||
指定应使颜色变暗多少。请注意,如果存在控制控制台格式的扩展(例如,XML 或 JSON 格式扩展),则将忽略此值。 环境变量: 显示更多 |
整数 |
|
字符串 |
||
布尔值 |
|
|
在刷新写入之前要使用的队列长度 环境变量: 显示更多 |
整数 |
|
确定在队列已满时是否阻止发布者(而不是丢弃消息) 环境变量: 显示更多 |
|
|
类型 |
默认 |
|
布尔值 |
|
|
字符串 |
|
|
|
||
|
||
字符串 |
||
布尔值 |
|
|
整数 |
|
|
|
|
|
布尔值 |
|
|
最大日志文件大小,超过该大小后执行轮换,最大为 环境变量: 显示更多 |
|
|
要保留的最大备份数。 环境变量: 显示更多 |
整数 |
|
文件处理程序轮换文件后缀。使用后,将根据其后缀轮换文件。 后缀必须是 示例 fileSuffix: .yyyy-MM-dd 注意:如果后缀以 .zip 或 .gz 结尾,则轮换文件也会被压缩。 环境变量: 显示更多 |
字符串 |
|
指示是否在服务器初始化时轮换日志文件。 您需要设置 环境变量: 显示更多 |
布尔值 |
|
类型 |
默认 |
|
布尔值 |
|
|
host:port |
|
|
字符串 |
||
字符串 |
||
设置设施,用于计算消息的优先级,如 RFC-5424 和 RFC-3164 定义 环境变量: 显示更多 |
|
|
设置此处理程序应用于格式化发送的消息的 环境变量: 显示更多 |
|
|
|
|
|
如果启用,则发送的消息将以消息大小为前缀 环境变量: 显示更多 |
|
|
布尔值 |
|
|
尝试重新连接 环境变量: 显示更多 |
布尔值 |
|
字符串 |
|
|
|
||
字符串 |
||
允许发送的消息的最大长度(以字节为单位),最大为 如果未设置,则当 环境变量: 显示更多 |
||
布尔值 |
|
|
在刷新写入之前要使用的队列长度 环境变量: 显示更多 |
整数 |
|
确定在队列已满时是否阻止发布者(而不是丢弃消息) 环境变量: 显示更多 |
|
|
类型 |
默认 |
|
布尔值 |
|
|
host:port |
|
|
|
|
|
尝试重新连接 环境变量: 显示更多 |
布尔值 |
|
字符串 |
|
|
|
||
字符串 |
||
布尔值 |
|
|
在刷新写入之前要使用的队列长度 环境变量: 显示更多 |
整数 |
|
确定在队列已满时是否阻止发布者(而不是丢弃消息) 环境变量: 显示更多 |
|
|
类型 |
默认 |
|
是否应启用控制台日志 环境变量: 显示更多 |
布尔值 |
|
控制台日志是否应转到 环境变量: 显示更多 |
布尔值 |
|
日志格式。请注意,如果存在控制控制台格式的扩展(例如,XML 或 JSON 格式扩展),则将忽略此值。 环境变量: 显示更多 |
字符串 |
|
控制台日志级别。 环境变量: 显示更多 |
|
|
指定应使颜色变暗多少。请注意,如果存在控制控制台格式的扩展(例如,XML 或 JSON 格式扩展),则将忽略此值。 环境变量: 显示更多 |
整数 |
|
要链接到控制台处理程序的过滤器的名称。 环境变量: 显示更多 |
字符串 |
|
指示是否异步记录日志 环境变量: 显示更多 |
布尔值 |
|
在刷新写入之前要使用的队列长度 环境变量: 显示更多 |
整数 |
|
确定在队列已满时是否阻止发布者(而不是丢弃消息) 环境变量: 显示更多 |
|
|
类型 |
默认 |
|
是否应启用文件日志 环境变量: 显示更多 |
布尔值 |
|
日志格式 环境变量: 显示更多 |
字符串 |
|
要写入文件的日志级别。 环境变量: 显示更多 |
|
|
将在其中写入日志的文件的名称。 环境变量: 显示更多 |
|
|
要链接到文件处理程序的过滤器的名称。 环境变量: 显示更多 |
字符串 |
|
使用的字符编码 环境变量: 显示更多 |
||
指示是否异步记录日志 环境变量: 显示更多 |
布尔值 |
|
在刷新写入之前要使用的队列长度 环境变量: 显示更多 |
整数 |
|
确定在队列已满时是否阻止发布者(而不是丢弃消息) 环境变量: 显示更多 |
|
|
是否启用日志轮换。 环境变量: 显示更多 |
布尔值 |
|
最大日志文件大小,超过该大小后执行轮换,最大为 环境变量: 显示更多 |
|
|
要保留的最大备份数。 环境变量: 显示更多 |
整数 |
|
文件处理程序轮换文件后缀。使用后,将根据其后缀轮换文件。 后缀必须是 示例 fileSuffix: .yyyy-MM-dd 注意:如果后缀以 .zip 或 .gz 结尾,则轮换文件也会被压缩。 环境变量: 显示更多 |
字符串 |
|
指示是否在服务器初始化时轮换日志文件。 您需要设置 环境变量: 显示更多 |
布尔值 |
|
类型 |
默认 |
|
是否应启用 syslog 日志 环境变量: 显示更多 |
布尔值 |
|
Syslog 服务器的 IP 地址和端口 环境变量: 显示更多 |
host:port |
|
以 RFC5424 格式格式化消息时使用的应用程序名称 环境变量: 显示更多 |
字符串 |
|
发送消息的主机的名称 环境变量: 显示更多 |
字符串 |
|
设置设施,用于计算消息的优先级,如 RFC-5424 和 RFC-3164 定义 环境变量: 显示更多 |
|
|
设置此处理程序应用于格式化发送的消息的 环境变量: 显示更多 |
|
|
设置用于连接到 Syslog 服务器的协议 环境变量: 显示更多 |
|
|
如果启用,则发送的消息将以消息大小为前缀 环境变量: 显示更多 |
|
|
设置为 环境变量: 显示更多 |
布尔值 |
|
尝试重新连接 环境变量: 显示更多 |
布尔值 |
|
日志消息格式 环境变量: 显示更多 |
字符串 |
|
日志级别,指定 Syslog 记录器将记录哪些消息级别 环境变量: 显示更多 |
|
|
要链接到文件处理程序的过滤器的名称。 环境变量: 显示更多 |
字符串 |
|
允许发送的消息的最大长度(以字节为单位),最大为 如果未设置,则当 环境变量: 显示更多 |
||
指示是否异步记录日志 环境变量: 显示更多 |
布尔值 |
|
在刷新写入之前要使用的队列长度 环境变量: 显示更多 |
整数 |
|
确定在队列已满时是否阻止发布者(而不是丢弃消息) 环境变量: 显示更多 |
|
|
类型 |
默认 |
|
是否应启用套接字日志 环境变量: 显示更多 |
布尔值 |
|
接收日志的服务器的 IP 地址和端口 环境变量: 显示更多 |
host:port |
|
设置用于连接到 syslog 服务器的协议 环境变量: 显示更多 |
|
|
尝试重新连接 环境变量: 显示更多 |
布尔值 |
|
日志消息格式 环境变量: 显示更多 |
字符串 |
|
日志级别,指定套接字记录器将记录哪些消息级别 环境变量: 显示更多 |
|
|
要链接到文件处理程序的过滤器的名称。 环境变量: 显示更多 |
字符串 |
|
指示是否异步记录日志 环境变量: 显示更多 |
布尔值 |
|
在刷新写入之前要使用的队列长度 环境变量: 显示更多 |
整数 |
|
确定在队列已满时是否阻止发布者(而不是丢弃消息) 环境变量: 显示更多 |
|
|
类型 |
默认 |
|
要匹配的消息前缀 环境变量: 显示更多 |
字符串列表 |
|
过滤消息的新日志级别。默认为 DEBUG。 环境变量: 显示更多 |
|
关于 MemorySize 格式
大小配置选项识别以下格式的字符串(显示为正则表达式): 如果未给出后缀,则假定为字节。 |