日志记录
概述
日志文件是系统可观测性的一个非常重要的方面,与监控非常相似。
RabbitMQ 在节点启动之初就会开始记录日志。有关节点状态和配置的许多重要信息将在节点引导期间或之后被记录。
开发人员和运维人员在排查问题或评估系统状态时,应检查日志。
RabbitMQ 在日志记录方面支持多种功能。
本指南涵盖了以下主题:
- RabbitMQ 节点记录和不记录的内容
- 支持的日志输出:文件和标准流(控制台)
- 日志文件位置
- 支持的日志级别
- 如何启用调试日志
- 如何在不访问日志文件的情况下追踪(tail)运行中节点的日志
- 监控内部事件
- 记录的连接生命周期事件
- 以 JSON 格式记录日志
- 日志类别
- 高级日志格式设置
- 如何在基于 systemd 的 Linux 系统上检查服务日志
- 日志轮转(Log rotation)
- 记录到 Syslog
- 记录到系统主题交换机,
amq.rabbitmq.log
等等。
RabbitMQ 会记录和不会记录什么?
RabbitMQ 节点处理许多不同类型的事件,实际上多到数不胜数。然而,设计上确实有一些类别的事件是不会被记录的。在大多数情况下,这些事件与单个消息相关,由于其速率极高(每秒数万、数十万,甚至使用流 (streams) 和超级流 (superstreams) 时达到数百万),因此不会记录:
- 消息路由
- 向消费者投递消息
- 消费者进行消息确认
- 无法路由的消息(被退回或丢弃)
- 消费者的注册和取消注册
与这些事件相关的大部分显著错误,例如重复确认投递,都会被记录。
为了分析消息路由、入口(发布)和出口(向消费者投递)速率、消费者事件以及无法路由的消息,请使用指标、观察内部事件、采用相关的客户端库功能,并捕获并检查流量。
日志输出
RabbitMQ 节点可以记录到多个输出端。记录到文件是 RabbitMQ 安装中最常见的选项之一。
记录到标准输出和错误流是另一个流行的选项。Syslog 是另一个开箱即用的支持方案。
不同的输出可以具有不同的日志级别。例如,控制台输出可以记录所有消息(包括调试信息),而文件输出可以仅记录错误及更高级别的消息。
默认日志输出和行为
如果未明确配置输出,节点默认会记录到文件。如果配置了某些输出,则将使用这些配置。
如果需要同时记录到文件和另一个输出,则必须在其他所需的日志输出(例如标准流)旁边明确列出文件输出。
日志文件位置
有两种配置日志文件位置的方法。一种是使用配置文件(推荐)。另一种是使用 RABBITMQ_LOGS 环境变量,这在开发环境中很有用。
RABBITMQ_LOGS 不能与配置文件设置合并使用。当设置了 RABBITMQ_LOGS 时,rabbitmq.conf 中的日志相关设置将实际上被忽略。
请参阅文件和目录位置指南,了解各种平台的默认日志文件位置。
日志文件位置可以在RabbitMQ 管理界面的节点页面上找到,也可以使用 rabbitmq-diagnostics 工具查看。
- bash
- PowerShell
- cmd
rabbitmq-diagnostics -q log_location
rabbitmq-diagnostics.bat -q log_location
rabbitmq-diagnostics.bat -q log_location
RABBITMQ_LOGS 变量的值可以是文件路径或连字符 (-)。将值设置为连字符,如下所示:
# Instructs the node to log to standard streams.
# IMPORTANT: the environment variable takes precedence over the configuration file.
# When it is set, all logging-related rabbitmq.conf settings will be
# effectively ignored.
RABBITMQ_LOGS=-
节点会将所有日志消息发送到标准 I/O 流,即标准输出。
环境变量的优先级高于配置文件。当设置了该变量时,所有 rabbitmq.conf 中的日志相关设置都将实际上被忽略。
覆盖日志文件位置的推荐方式是通过 rabbitmq.conf。
如何配置日志记录
以下几个部分涵盖了与日志记录相关的各种配置设置。它们都使用现代配置格式 rabbitmq.conf。
请参阅配置指南,获取有关如何配置 RabbitMQ 的概述。
记录到文件
记录到文件是 RabbitMQ 安装中最常见的选项之一。在现代发行版中,RabbitMQ 节点仅在通过下方列出的配置键明确配置时才会记录到文件:
log.file:日志文件路径,或设置为false以停用文件输出。默认值取自RABBITMQ_LOGS环境变量或配置文件。log.file.level:文件输出的日志级别。默认级别为info。log.file.formatter:控制日志条目格式,为文本行或 JSON。log.file.rotation.date,log.file.rotation.size,log.file.rotation.count:用于日志文件轮转设置。log.file.formatter.time_format:控制时间戳格式。
以下示例覆盖了日志文件名:
log.file = rabbit.log
以下示例覆盖了日志文件位置:
log.file = /opt/custom/var/log/rabbit.log
以下示例指示 RabbitMQ 以 debug 级别记录到文件:
log.file.level = debug
有关支持的日志级别列表,请参阅日志级别。
可以通过以下方式停用记录到文件:
log.file = false
以 JSON 格式记录到文件:
log.file.formatter = json
默认情况下,RabbitMQ 将使用 RFC 3339 时间戳格式。可以切换为基于 UNIX epoch 的格式:
log.file = true
log.file.level = info
# use microseconds since UNIX epoch for timestamp format
log.file.formatter.time_format = epoch_usecs
本指南的其余部分描述了更多选项,包括一些高级选项。
日志轮换
当记录到文件时,推荐的轮转选项是 logrotate。
RabbitMQ 节点始终追加到日志文件,因此保留了完整的日志历史记录。默认情况下不执行日志文件轮转。Debian 和 RPM 包将在安装后设置通过 logrotate 进行日志轮转。
log.file.rotation.date, log.file.rotation.size, log.file.rotation.count 设置控制文件输出的日志文件轮转。
使用 Logrotate 进行轮转
在 Linux、BSD 和其他类 UNIX 系统上,logrotate 是一种广泛使用的日志文件轮转工具。它非常成熟,并支持许多选项。
RabbitMQ 的 Debian 和 RPM 包将设置 logrotate,每周对位于默认 /var/log/rabbitmq 目录中的文件进行处理。轮转配置可以在 /etc/logrotate.d/rabbitmq-server 中找到。
内置定期轮转
log.file.rotation.date 不能与 log.file.rotation.size 结合使用,这两个选项是互斥的。
使用 log.file.rotation.date 设置最小化定期轮转:
# rotate every night at midnight
log.file.rotation.date = $D0
# keep up to 5 archived log files in addition to the current one
log.file.rotation.count = 5
# archived log files will be compressed
log.file.rotation.compress = true
# rotate every day at 23:00 (11:00 p.m.)
log.file.rotation.date = $D23
内置基于文件大小的轮转
log.file.rotation.size 不能与 log.file.rotation.date 结合使用,这两个选项是互斥的。
log.file.rotation.size 控制基于当前日志文件大小的轮转:
# rotate when the file reaches 10 MiB
log.file.rotation.size = 10485760
# keep up to 5 archived log files in addition to the current one
log.file.rotation.count = 5
# archived log files will be compressed
log.file.rotation.compress = true
记录到控制台(标准输出)
记录到标准流(控制台)是 RabbitMQ 安装的另一个常用选项,特别是当 RabbitMQ 节点部署在容器中时。RabbitMQ 节点仅在明确配置时才会记录到标准流。
以下是控制控制台(标准输出)日志记录的主要设置:
log.console(布尔值):设置为true以激活控制台输出。默认为false。log.console.level:控制台输出的日志级别。默认级别为info。log.console.formatter:控制日志条目格式,文本行或 JSON。log.console.formatter.time_format:控制时间戳格式。
要激活控制台日志记录,请使用以下配置片段:
log.console = true
以下示例停用了控制台日志记录:
log.console = false
以下示例指示 RabbitMQ 在记录到控制台时使用 debug 日志级别:
log.console.level = debug
有关支持的日志级别列表,请参阅日志级别。
以 JSON 格式记录到控制台:
log.console.formatter = json
当激活控制台输出时,默认也会激活文件输出。要停用文件输出,请将 log.file 设置为 false。
log.console = true
log.console.level = info
log.file = false
默认情况下,RabbitMQ 将使用 RFC 3339 时间戳格式。可以切换为基于 UNIX epoch 的格式:
log.console = true
log.console.level = info
log.file = false
# use microseconds since UNIX epoch for timestamp format
log.console.formatter.time_format = epoch_usecs
请注意,即使配置了 log.file,RABBITMQ_LOGS=- 也会停用文件输出。
记录到 Syslog
RabbitMQ 日志可以通过 TCP 或 UDP 转发到 Syslog 服务器。默认使用 UDP,并且需要 Syslog 服务配置。同时支持 TLS。
必须明确配置 Syslog 输出:
log.syslog = true
Syslog 端点配置
默认情况下,Syslog 记录器将使用 RFC 3164 协议将日志消息发送到 UDP 端口 514。也可以使用 RFC 5424 协议。
为了使用 UDP,Syslog 服务必须配置 UDP 输入。
UDP 和 TCP 传输可以与 RFC 3164 和 RFC 5424 协议一起使用。TLS 支持需要 RFC 5424 协议。
以下示例使用 TCP 和 RFC 5424 协议:
log.syslog = true
log.syslog.transport = tcp
log.syslog.protocol = rfc5424
要使用 TLS,必须提供一套标准的 TLS 选项:
log.syslog = true
log.syslog.transport = tls
log.syslog.protocol = rfc5424
log.syslog.ssl_options.cacertfile = /path/to/ca_certificate.pem
log.syslog.ssl_options.certfile = /path/to/client_certificate.pem
log.syslog.ssl_options.keyfile = /path/to/client_key.pem
可以自定义 Syslog 服务 IP 地址和端口:
log.syslog = true
log.syslog.ip = 10.10.10.10
log.syslog.port = 1514
如果使用主机名而不是 IP 地址:
log.syslog = true
log.syslog.host = my.syslog-server.local
log.syslog.port = 1514
还可以配置 Syslog 元数据标识(identity)和设施(facility)值。默认情况下,标识将被设置为节点名称的名称部分(例如,rabbitmq@hostname 中的 rabbitmq),设施将被设置为 daemon。
设置日志消息的标识和设施:
log.syslog = true
log.syslog.identity = my_rabbitmq
log.syslog.facility = user
以 JSON 格式记录到 Syslog:
log.syslog = true
log.syslog.formatter = json
较少使用的 Syslog 客户端 选项可以使用高级配置文件进行配置。
JSON 日志记录
RabbitMQ 节点可以将日志消息格式化为 JSON,这对于其他软件进行解析非常方便。
以 JSON 格式记录到文件:
log.file.level = info
log.file.formatter = json
以 JSON 格式记录到控制台:
log.console = true
log.console.level = info
log.console.formatter = json
log.file = false
以 JSON 格式记录到 Syslog:
log.syslog = true
log.syslog.formatter = json
请注意,可以自定义 JSON 对象字段映射,以匹配日志收集工具所期望的特定基于 JSON 的日志格式。
日志消息类别
RabbitMQ 有几个类别的消息,可以使用不同的级别或记录到不同的文件。类别包括:
connection:AMQP 0-9-1、AMQP 1.0、MQTT 和 STOMP 的连接生命周期事件。channel:通道日志。主要是 AMQP 0-9-1 通道上的错误和警告。queue:队列日志。主要是调试消息。federation:联邦(federation)插件日志。upgrade:冗长的升级日志。这些日志可能过多。default:所有其他日志条目。您无法为此类别覆盖文件位置。
可以使用 log.<category>.level 和 log.<category>.file 配置变量为每个消息类别配置不同的日志级别或文件位置。
默认情况下,每个类别都不会按级别进行过滤。如果配置了输出以记录 debug 消息,则所有类别的调试消息都会被打印。配置类别级别以进行覆盖。
例如,在文件输出中使用 debug 级别时,以下配置将停用连接事件的调试日志记录:
log.file.level = debug
log.connection.level = info
要将所有联邦日志重定向到 rabbit_federation.log 文件,请使用:
log.federation.file = rabbit_federation.log
要停用某个日志类型,可以使用 none 日志级别。例如,要停用升级日志:
log.upgrade.level = none
日志级别
日志级别是过滤和调整日志记录的另一种方法。日志级别有严格的排序。每条日志消息都有一个严重性级别,从最低严重性的 debug 到最高严重性的 critical。
可以通过为类别和输出设置日志级别,在多个层面上控制日志记录的冗长程度。日志级别越详细,包含的日志消息就越多,从最详细的 debug 到最不详细的 none。
RabbitMQ 使用以下日志级别:
| 日志级别 | 冗长程度 | 严重性 |
|---|---|---|
debug | 最冗长 | 最低严重性 |
info | ||
warning | ||
error | ||
critical | 最高严重性 | |
none | 最不冗长 | 不适用 |
默认日志级别为 info。
如果日志消息的严重性低于类别级别,则该消息将被丢弃,不会发送到任何输出端。
如果未配置类别级别,其消息将始终发送到所有输出端。
要使 default 类别仅记录错误或更高严重性的消息,请使用:
log.default.level = error
none 级别意味着不进行日志记录。
每个输出端可以使用其自己的日志级别。如果消息的严重性低于输出级别,则该消息将不会被记录。
例如,如果没有配置任何输出端来记录 debug 消息,即使类别级别设置为 debug,调试消息也不会被记录。
另一方面,如果某个输出端被配置为记录 debug 消息,它将获取所有类别的调试消息,除非某个类别配置了详细程度较低的级别。
更改日志级别
有两种更改有效日志级别的方法:
- 通过配置文件:这种方法更灵活,但更改后需要重启节点。
- 使用命令行工具,
rabbitmqctl set_log_level <level>:更改是暂时的(重启节点后无效),但可用于在运行时激活和停用,例如在一段时间内使用调试日志。
要在运行中的节点上将日志级别设置为 debug:
rabbitmqctl -n rabbit@target-host set_log_level debug
要将级别设置为 info:
rabbitmqctl -n rabbit@target-host set_log_level info
使用 CLI 工具追踪日志
现代版本支持使用命令行工具追踪节点日志。当日志文件位置未知或无法轻易访问,但允许连接 CLI 工具时,这非常方便。
要追踪节点 rabbitmq@target-host 的最后三百行,请使用 rabbitmq-diagnostics log_tail:
# This is semantically equivalent to using `tail -n 300 /path/to/rabbit@hostname.log`.
# Use -n to specify target node, -N is to specify the number of lines.
rabbitmq-diagnostics -n rabbit@target-host log_tail -N 300
这将加载并打印日志文件的最后几行。如果仅激活了控制台日志记录,此命令将失败,并提示“找不到文件”(enoent) 错误。
要像 tail -f 或控制台日志记录一样,在日志行被追加到文件时持续检查日志流,请使用 rabbitmq-diagnostics log_tail_stream:
# This is semantically equivalent to using `tail -f /path/to/rabbit@hostname.log`.
# Use Control-C to stop the stream.
rabbitmq-diagnostics -n rabbit@target-host log_tail_stream
这将持续追踪并流式传输添加到日志文件中的行。如果仅激活了控制台日志记录,此命令将失败,并提示“找不到文件”(enoent) 错误。
rabbitmq-diagnostics log_tail_stream 命令只能针对正在运行的 RabbitMQ 节点使用。如果节点未运行,或者已使用 rabbitmqctl stop_app 停止了其上的 RabbitMQ 应用程序,则该命令将失败。
激活调试日志
启用调试日志记录后,节点将记录大量对排查问题有用的信息。此日志严重性级别旨在排查问题时使用,例如对等发现活动。
例如,将调试消息记录到文件:
log.file.level = debug
将日志消息打印到标准 I/O 流:
log.console = true
log.console.level = debug
在运行时切换到调试日志记录:
rabbitmqctl -n rabbit@target-host set_log_level debug
将级别改回 info:
rabbitmqctl -n rabbit@target-host set_log_level info
可以为某些类别停用调试日志记录:
log.file.level = debug
log.connection.level = info
log.channel.level = info
高级日志格式
本节涵盖与高级日志格式相关的功能。这些设置在大多数环境中是不必要的,但可用于使 RabbitMQ 日志适配特定格式。
本节中的大多数示例使用以下格式:
log.file.formatter.level_format = lc4
然而,键也可以是以下之一:
log.file.formatter.level_formatlog.console.formatter.level_formatlog.exchange.formatter.level_format
换句话说,本节中记录的大多数设置不特定于某个特定的日志输出,无论是 file、console 还是 exchange。
时间格式
时间戳格式可以设置为以下格式之一:
rfc3339_space:带空格的 RFC 3339 格式,这是默认格式。rfc3339_T:与上面相同,但使用制表符。epoch_usecs:时间戳(自 UNIX epoch 以来的时间),以微秒为单位。epoch_secs:时间戳(自 UNIX epoch 以来的时间),以秒为单位。
# this is the default format
log.file.formatter.time_format = rfc3339_space
例如,以下格式:
log.file.formatter.time_format = epoch_usecs
将产生如下所示的日志消息:
1728025620684139 [info] <0.872.0> started TCP listener on [::]:5672
1728025620687050 [info] <0.892.0> started TLS (SSL) listener on [::]:5671
日志级别格式
日志级别可以以不同的方式格式化。
# full value, lower case is the default format
log.file.formatter.level_format = lc
# use the four character, upper case format
log.file.formatter.level_format = uc4
以下值有效:
lc:完整值,小写(默认),例如warning或info。uc:完整值,大写,例如WARNING或INFO。lc3:三个字符,小写,例如inf或dbg。uc3:三个字符,大写,例如INF或WRN。lc4:四个字符,小写,例如dbug或warn。uc4:四个字符,大写,例如DBUG或WARN。
日志消息格式
仅当覆盖日志格式是日志收集工具的硬性要求时,才应将此设置作为最后的手段。
除了格式化单个日志消息组件(事件时间、日志级别、消息等)外,整个日志行格式也可以使用 log.file.formatter.format 配置设置进行更改。
该设置必须设置为使用以下 $variables 的消息模式:
$time$level- Erlang 进程
$pid - 日志
$msg
这是默认格式的样子:
# '$time [$level] $pid $msg' is the default format
log.console.formatter.plaintext.format = $time [$level] $pid $msg
以下自定义格式:
# '$time [$level] $pid $msg' is the default format
log.console.formatter.plaintext.format = $level $time $msg
将产生如下所示的日志消息:
info 2024-10-04 03:23:52.968389-04:00 connection 127.0.0.1:57181 -> 127.0.0.1:5672: user 'guest' authenticated and granted access to vhost '/'
debug 2024-10-04 03:24:03.338466-04:00 Will reconcile virtual host processes on all cluster members...
debug 2024-10-04 03:24:03.338587-04:00 Will make sure that processes of 9 virtual hosts are running on all reachable cluster nodes
注意 Erlang 进程 pid 是如何被排除的。此信息对于根源分析 (RCA) 可能至关重要,因此强烈建议使用默认格式。
JSON 字段映射
JSON 日志记录可以通过以下方式自定义:
- 单个键可以使用
{standard key}:{renamed key}表达式重命名。 - 单个键可以使用
{standard key:-}表达式删除。 - 可以使用
*:-表达式删除除明确列出的键之外的所有键。
然后,log.file.formatter.json.field_map 键必须设置为包含上述多个表达式的字符串值。
在演示示例之前,这是一条带有默认映射的消息:
{
"time":"2024-10-04 03:38:29.709578-04:00",
"level":"info",
"msg":"Time to start RabbitMQ: 2294 ms",
"line":427,
"pid":"<0.9.0>",
"file":"rabbit.erl",
"mfa":["rabbit","start_it",1]
}
{
"time":"2024-10-04 03:38:35.600956-04:00",
"level":"info",
"msg":"accepting AMQP connection 127.0.0.1:57604 -> 127.0.0.1:5672",
"pid":"<0.899.0>",
"domain":"rabbitmq.connection"
}
现在,一个使用带有自定义字段映射的 JSON 日志记录的示例:
# log as JSON
log.file.formatter = json
# Rename the 'time' field to 'ts', 'level' to 'lvl' and 'msg' to 'message',
# drop all other fields.
# Use an 'escaped string' just to make the value stand out
log.file.formatter.json.field_map = 'time:ts level:lvl msg:message *:-'
上面的示例将产生以下消息。请注意与上面默认示例相比,某些信息是如何被省略的:
{
"ts":"2024-10-04 03:34:43.600462-04:00",
"lvl":"info",
"message":"Time to start RabbitMQ: 2577 ms"
}
{
"ts":"2024-10-04 03:34:49.142396-04:00",
"lvl":"info",
"message":"accepting AMQP connection 127.0.0.1:57507 -> 127.0.0.1:5672"
}
强制单行日志记录
此设置可能导致不完整的日志消息,仅当覆盖日志格式是日志收集工具的硬性要求时,才应将其作为最后的手段。
多行消息可以被截断为单行:
# Accepted values are 'on' and 'off'.
# The default is 'off'.
log.console.formatter.single_line = on
此设置可能导致不完整的日志消息,仅应作为最后的手段使用。
服务日志
在基于 systemd 的 Linux 发行版上,可以使用 journalctl --system 检查系统服务日志。
journalctl --system
这需要超级用户权限。其输出可以被过滤,以仅显示 RabbitMQ 特定的条目:
sudo journalctl --system | grep rabbitmq
服务日志将包含节点的标准输出和标准错误流。journalctl --system 的输出将类似于:
Aug 26 11:03:04 localhost rabbitmq-server[968]: ## ##
Aug 26 11:03:04 localhost rabbitmq-server[968]: ## ## RabbitMQ 4.0.4. Copyright (c) 2005-2026 Broadcom. All Rights Reserved. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
Aug 26 11:03:04 localhost rabbitmq-server[968]: ########## Licensed under the MPL. See https://rabbitmq.cn/
Aug 26 11:03:04 localhost rabbitmq-server[968]: ###### ##
Aug 26 11:03:04 localhost rabbitmq-server[968]: ########## Logs: /var/log/rabbitmq/rabbit@localhost.log
Aug 26 11:03:04 localhost rabbitmq-server[968]: /var/log/rabbitmq/rabbit@localhost_upgrade.log
Aug 26 11:03:04 localhost rabbitmq-server[968]: Starting broker...
Aug 26 11:03:05 localhost rabbitmq-server[968]: systemd unit for activation check: "rabbitmq-server.service"
Aug 26 11:03:06 localhost rabbitmq-server[968]: completed with 6 plugins.
记录的事件
连接生命周期事件
发送至少 1 字节数据的成功 TCP 连接将被记录。不发送任何数据的连接(例如某些负载均衡器产品的健康检查)将不会被记录。
这是一个例子。
2018-11-22 10:44:33.654 [info] <0.620.0> accepting AMQP connection <0.620.0> (127.0.0.1:52771 -> 127.0.0.1:5672)
条目包含客户端 IP 地址和端口 (127.0.0.1:52771) 以及服务器的目标 IP 地址和端口 (127.0.0.1:5672)。此信息在排查客户端连接问题时非常有用。
一旦连接成功认证并获得访问虚拟主机的权限,也会被记录。
2018-11-22 10:44:33.663 [info] <0.620.0> connection <0.620.0> (127.0.0.1:52771 -> 127.0.0.1:5672): user 'guest' authenticated and granted access to vhost '/'
上面的示例包含了两个可以在各种场景中用作连接标识符的值:连接名称 (127.0.0.1:57919 -> 127.0.0.1:5672) 和连接的 Erlang 进程 ID (<0.620.0>)。后者由 rabbitmqctl 使用,前者由 HTTP API 使用。
客户端连接可以干净地关闭或异常关闭。在前一种情况下,客户端使用专用库函数(方法)优雅地关闭 AMQP 0-9-1(或 1.0,或 STOMP,或 MQTT)连接。在后一种情况下,客户端关闭 TCP 连接或 TCP 连接失败。RabbitMQ 将记录这两种情况。
以下是一个成功关闭连接的示例条目:
2018-06-17 06:23:29.855 [info] <0.634.0> closing AMQP connection <0.634.0> (127.0.0.1:58588 -> 127.0.0.1:5672, vhost: '/', user: 'guest')
异常关闭的连接将被记录为警告:
2018-06-17 06:28:40.868 [warning] <0.646.0> closing AMQP connection <0.646.0> (127.0.0.1:58667 -> 127.0.0.1:5672, vhost: '/', user: 'guest'):
client unexpectedly closed TCP connection
异常关闭的连接可能是无害的。例如,一个短命的程序可能会自然停止而没有机会关闭其连接。它们也可能暗示存在真正的问题,例如失败的应用程序进程或关闭其认为空闲的 TCP 连接的代理。
监控内部事件
RabbitMQ 节点具有内部机制。它的一些事件可能对监控、审计和排查目的有用。它们可以使用 rabbitmq-diagnostics 命令作为 JSON 对象进行消费:
# will emit JSON objects
rabbitmq-diagnostics consume_event_stream
交互使用时,结果可以管道传输到命令行 JSON 处理器,例如 jq。
rabbitmq-diagnostics consume_event_stream | jq
事件作为具有空主体的消息发布。所有事件元数据都存储在消息注释(属性、标题)中。
以下是已发布事件的列表。
核心代理
队列、交换机和绑定事件
queue.deletedqueue.createdexchange.createdexchange.deletedbinding.createdbinding.deleted
connection.createdconnection.closedchannel.createdchannel.closed
消费者事件
consumer.createdconsumer.deleted
策略和参数事件
policy.setpolicy.clearedqueue.policy.updatedqueue.policy.clearedparameter.setparameter.cleared
虚拟主机事件
vhost.createdvhost.deletedvhost.limits.setvhost.limits.cleared
用户管理事件
user.authentication.successuser.authentication.failureuser.createduser.deleteduser.password.changeduser.password.cleareduser.tags.set
权限事件
permission.createdpermission.deletedtopic.permission.createdtopic.permission.deleted
警报事件
alarm.setalarm.cleared
Shovel 插件
工作器(Worker)事件
shovel.worker.statusshovel.worker.removed
Federation 插件
链接事件
federation.link.statusfederation.link.removed
使用系统日志交换机消费日志条目
RabbitMQ 可以将日志条目转发到系统交换机 amq.rabbitmq.log,该交换机将在默认虚拟主机中声明。
此功能默认停用。要激活此日志记录,请将 log.exchange 配置键设置为 true。
# activate log forwarding to amq.rabbitmq.log, a topic exchange
log.exchange = true
log.exchange.level 可用于控制此日志记录目标所使用的日志级别。
log.exchange = true
log.exchange.level = warning
amq.rabbitmq.log 是一个常规主题交换机,可以按此方式使用。日志条目作为消息发布。消息主体包含记录的消息,路由键被设置为日志级别。
想要消费日志条目的应用程序需要声明一个队列并将其绑定到该交换机,使用路由键过滤特定的日志级别,或者使用 # 消费所有配置的日志级别允许的日志条目。