阅读 1377

RabbitMQ系列(八)RabbitMQ的日志

概述

日志文件是系统可观察性的一个非常重要的方面,很像监视。在排除问题或评估系统状态时,开发人员和操作人员应该检查日志。RabbitMQ支持许多日志功能。

本指南涵盖的主题包括:
1)日志文件位置
2)日志级别
3)日志分类
4)支持日志输出
5)记录请求连接的生命周期事件
6)日志滚动
7)记录系统日志
8)监视内部事件
9)调试日志
10)高级配置主题(自定义日志处理程序、接收等)
更多...

日志文件位置

在RabbitMQ 3.7.0之前版本,有两个日志文件:普通消息和未处理的异常。从RabbitMQ 3.7.0开始,默认使用一个日志文件。请查看RabbitMQ系列(五) RabbitMQ的文件和目录位置查找默认的日志文件位置。
有两种配置日志文件位置:一个是配置文件;另一个是RABBITMQ_LOGS环境变量;其中,环境变量优先于配置文件。
使用RabbitMQ管理UI或rabbitmqctl环境查找节点何时存储其日志文件。
RABBITMQ_LOGS变量值可以是文件路径,也可以是连字符(-)。RABBITMQ_LOGS=-将导致所有日志消息被发送到标准输出。。

配置

从3.7.0开始,RabbitMQ使用了底层的Lager日志库。Lager支持不同源的日志记录,并且是高度可配置的。
RabbitMQ在节点启动时就开始日志记录。默认的RabbitMQ日志配置将把日志消息定向到日志文件。标准输出是另一个现成可用的选项。几个输出可以同时使用。日志条目将被复制到所有的日志中。
不同的输出可以有不同的日志级别。例如,控制台输出可以记录所有消息(包括调试信息),而文件输出只能记录错误和更严重的消息。

记录到文件

1)log.file: 日志文件路径或false来禁用文件输出。默认值取自RABBITMQ_LOGS环境变量或配置文件。
2)log.file.level: 文件输出的日志级别。默认级别是info。
3)log.file.rotation.date, log.file.rotation.size, log.file.rotation.count 用于日志文件旋转设置。

如下示例是设置日志文件名称

log.file = rabbit.log
复制代码

如下示例是设置日志文件目录:

log.dir = /data/logs/rabbitmq
复制代码

如下示例是设置日志级别:

log.file.level = debug
复制代码

在示例rabbitmq.conf.文件中查找受支持的日志级别。

禁用日志:

log.file = false
复制代码

经典配置格式

[{rabbit, [
        {log, [
            {file, [{file, "/path/to/log/file.log"}, %% log.file
                    {level, info},        %% log.file.info
                    {date, ""},           %% log.file.rotation.date
                    {size, 0},            %% log.file.rotation.size
                    {count, 1}            %% log.file.rotation.count
                    ]}
        ]}
    ]}]
复制代码

日志滚动

RabbitMQ节点总是附加到日志文件中,因此完整的日志历史记录得以保留。默认情况下,Lager不会执行日志文件滚动。Debian和RPM包将通过安装包后的logrotate设置日志滚动。

设置控制文件输出的日志文件滚动:
log.file.rotation.date
log.file.rotation.size
log.file.rotation.count

定期滚动

使用log.file.rotation。设置周期性(基于日期和时间的)旋转的日期。它使用与newsyslog.conf相同的语法:

# 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

# rotate every day at 23:00 (11:00 p.m.)
log.file.rotation.date = $D23

# rotate every hour at HH:00
log.file.rotation.date = $H00

# rotate every day at 12:30 (00:30 p.m.)
log.file.rotation.date = $D12H30

# rotate every week on Sunday at 00:00
log.file.rotation.date = $W0D0H0

# rotate every week on Friday at 16:00 (4:00 p.m.)
log.file.rotation.date = $W5D16

# rotate every night at midnight
log.file.rotation.date = $D0
复制代码

基于文件大小的滚动

log.file.rotation.size:控制基于当前日志文件大小的滚动。

# rotate when the file reaches 10 MB
log.file.rotation.size = 10485760

# keep up to 5 archived log files in addition to the current one
log.file.rotation.count = 5
复制代码

使用Logrotate滚动

在Linux、BSD和其他类Unix系统上,logrotate是日志文件旋转和压缩的另一种方式。
RabbitMQ Debian和RPM包将设置Logrotate对位于默认/var/log/rabbitmq目录下的文件每周运行一次。滚动配置可以在/etc/logrotate.d/rabbitmq-server中找到。

日志记录到控制台(标准输出)

以下是控制台(标准输出)日志的主要设置:
1)log.console (boolean): 设置为true以启用控制台输出。默认为false。 2)log.console.level: 控制台输出的日志级别。默认级别是info。

要启用控制台日志,请使用以下配置片段:

log.console = true
复制代码

下面的示例禁用控制台日志记录:

log.console = false
复制代码

下面的示例指示RabbitMQ在将日志记录到控制台时使用调试日志级别:

log.console.level = debug
复制代码

经典配置格式:

[{rabbit, [
        {log, [
            {console, [{enabled, true}, %% log.console
                       {level, info}    %% log.console.level
            ]}
        ]}
    ]}]
复制代码

注意:在启用控制台输出时,默认情况下也将启用文件输出。若要禁用文件输出,请设置日志。文件为false。 请注意,RABBITMQ_LOGS=-将禁用文件输出,即使是在日志中。文件配置。

记录到Syslog

RabbitMQ日志可以通过TCP或者UDP记录到Syslog服务器。默认使用UDP并且需要Syslog服务配置。也支持TLS。
Syslog输出必须显示配置:

log.syslog = true
复制代码

经典配置格式:

[{rabbit, [{log, [
    {syslog, [{enabled, true}]}]}]
}]
复制代码

Syslog端点配置

默认情况下,Syslog日志记录器将使用RFC 3164协议或者RFC 5424协议将日志消息发送到UDP端口514。RFC 3164和RFC 5424协议都可以使用UDP和TCP传输。TLS支持需要RFC 5424协议。
为了使用UDP, Syslog服务必须配置UDP输入。

下面的例子使用TCP和RFC 5424协议:

log.syslog = true
log.syslog.transport = tcp
log.syslog.protocol = rfc5424
复制代码

经典配置格式:

[{rabbit, [{log, [{syslog, [{enabled, true}]}]}]},
 {syslog, [{protocol, {tcp, 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
复制代码

经典配置格式:

[{rabbit, [{log, [{syslog, [{enabled, true}]}]}]},
 {syslog, [{protocol, {tls, rfc5424,
                        [{cacertfile,"/path/to/ca_certificate.pem"},
                         {certfile,"/path/to/client_certificate.pem"},
                         {keyfile,"/path/to/client_key.pem"}]}}]}
]
复制代码

Syslog服务IP地址和端口可以定制:

log.syslog = true
log.syslog.ip = 10.10.10.10
log.syslog.port = 1514
复制代码

经典配置格式:

[{rabbit, [{log, [{syslog, [{enabled, true}]}]}]},
 {syslog, [{dest_host, {10, 10, 10, 10}},
           {dest_port, 1514}]}
]
复制代码

如果要使用主机名而不是IP地址:

log.syslog = true
log.syslog.host = my.syslog-server.local
log.syslog.port = 1514
复制代码

经典配置格式:

[{rabbit, [{log, [{syslog, [{enabled, true}]}]}]},
 {syslog, [{dest_host, "my.syslog-server.local"},
           {dest_port, 1514}]}
]
复制代码

还可以配置Syslog元数据标识和功能值。默认情况下,identity将设置为节点名的名称部分(例如rabbitmq在rabbitmq@hostname中),facility将设置为daemon。
设置日志信息的标识和功能:

log.syslog = true
log.syslog.identity = my_rabbitmq
log.syslog.facility = user
复制代码

经典配置格式:

[{rabbit, [{log, [{syslog, [{enabled, true}]}]}]},
 {syslog, [{app_name, "my_rabbitmq"},
           {facility, user}]}
]
复制代码

不太常用的Syslog客户端选项可以使用advanced.config进行配置。

日志消息分类

RabbitMQ有几类消息,它们可以记录在不同的级别或不同的文件中。这些分配替换了RabbitMQ 3.7.0版本之前的rabbit.log_levels配置项设置。

消息分类:
connection: AMQP 0-9-1, AMQP 1.0, MQTT 和 STOMP的请求连接事件;
channel: 通道日志。几乎是AMQP 0-9-1通道的错误和告警日志;
queue: 队列日志。几乎是调试日志;
mirroring: 队列镜像日志。队列镜像状态变更:starting/stopping/synchronizing;
federation: 联合插件日志;
upgrade: 详细的升级日志;
default: 所有其他日志项。您不能为此类别覆盖文件位置;

可以使用log.<category>.level和log.<category>.file为每种日志配置不同的日志级别和文件位置。
默认情况下,每个类别不会根据级别进行筛选。如果将输出配置为记录调试消息,则将打印所有类别的调试消息。可为要覆盖的类别配置日志级别。例如,给定文件输出中的调试级别,下面将禁用连接事件的调试日志记录:

log.file.level = debug
log.connection.level = info
复制代码

经典格式配置:

[{rabbit,
    [{log,
        [{file, [{level, debug}]},
         {categories,
            [{connection,
                [{level, info}]
            }]
        }]
    }]
}]
复制代码

使用如下配置将所有联合日志重定向到rabbit_federation.log文件:

log.federation.file = rabbit_federation.log
复制代码

经典配置格式:

[{rabbit,
    [{log,
        [{categories,
            [{federation,
                [{file, "rabbit_federation.log"}]
            }]
        }]
    }]
}]
复制代码

要禁用某一日志类型,可以使用无日志级别。例如,要禁用升级日志:

log.upgrade.level = none
复制代码

经典配置格式:

[{rabbit,
    [{log,
        [{categories,
            [{upgrade,
                [{level, none}]
            }]
        }]
    }]
}]
复制代码

日志级别

日志级别是过滤和调优日志记录的另一种方法。每个日志级别都有一个与之相关的严重性。更关键的消息的严重程度更低,而debug的严重程度最高。 RabbitMQ使用以下日志级别:

日志级别 严重程度
debug 128
info 64
warning 16
error 8
critical 4
none 0

默认的日志级别是info。none级别意味着不记录日志。
如果日志级别高于分类级别,消息将被删除,不会发送到任何输出。如果未配置类别级别,则始终将其消息发送到所有输出。 若要使默认类别只记录错误或更严重的消息,请使用:

log.default.level = error
复制代码

每个输出可以使用自己的日志级别。如果消息级别号高于输出级别,则不会记录消息。例如,如果没有将输出配置为记录调试消息,即使将类别级别设置为debug,也不会记录调试消息。但是,如果输出被配置为记录调试消息,那么它将从所有类别获取这些消息,除非配置了类别级别。

有两种更改有效日志级别的方法:
1)通过配置文件:这更加灵活,但是需要在更改之间重新启动节点;
2)使用rabbitmqctl set_log_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
复制代码

经典配置格式:

[{rabbit, [{log, [
    {file, [{level, debug}]}]
}]
复制代码

将日志消息打印到标准I/O流:

log.console = true
log.console.level = debug
复制代码

经典配置格式:

[{rabbit, [{log, [
    {console, [{enabled, true},
               {level, debug}]}
    ]}]
}]
复制代码

在运行时切换到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
复制代码

经典配置格式:

[{rabbit, [{log, [
    {file, [{level, debug}]},
    {categories, [
        {connection, [{level, info}]},
        {channel, [{level, info}]}
        ]}
    ]}]
}]
复制代码

服务日志

在基于系统的Linux发行版上,可以使用journalctl——system检查系统服务日志。

journalctl --system
复制代码

这需要超级用户特权。它的输出可以被过滤,以缩小到rabbitmq特定的条目:

sudo journalctl --system | grep rabbitmq
复制代码

服务日志将包括节点的标准输出和标准错误流。journalctl——系统的输出将类似如下:

Dec 26 11:03:04 localhost rabbitmq-server[968]: ##  ##
Dec 26 11:03:04 localhost rabbitmq-server[968]: ##  ##      RabbitMQ 3.7.14. Copyright (c) 2007-2019 Pivotal Software, Inc.
Dec 26 11:03:04 localhost rabbitmq-server[968]: ##########  Licensed under the MPL.  See http://www.rabbitmq.com/
Dec 26 11:03:04 localhost rabbitmq-server[968]: ######  ##
Dec 26 11:03:04 localhost rabbitmq-server[968]: ##########  Logs: /var/log/rabbitmq/rabbit@localhost.log
Dec 26 11:03:04 localhost rabbitmq-server[968]: /var/log/rabbitmq/rabbit@localhost_upgrade.log
Dec 26 11:03:04 localhost rabbitmq-server[968]: Starting broker...
Dec 26 11:03:05 localhost rabbitmq-server[968]: systemd unit for activation check: "rabbitmq-server.service"
Dec 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')
复制代码

在RabbitMQ 3.7之前,其格式是不同的:

=INFO REPORT==== 30-Oct-2017::21:40:32 ===
closing AMQP connection <0.24990.164> (127.0.0.1:57919 -> 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
复制代码

RabbitMQ 3.7.0之前的格式:

=WARNING REPORT==== 1-Nov-2017::16:58:58 ===
closing AMQP connection <0.601.0> (127.0.0.1:60471 -> 127.0.0.1:5672, vhost: '/', user: 'guest'):
client unexpectedly closed TCP connection
复制代码

突然关闭的连接可能是无害的。例如,短生命期的程序可以自然地停止,并且没有机会关闭它的连接。它们还可以提示真正的问题,比如失败的应用程序进程或关闭它认为空闲的TCP连接的代理。

从RabbitMQ 3.7.0版本升级

3.7.0之前的RabbitMQ版本有一个不同的日志子系统。 旧的安装使用两个日志文件:<nodename>.log和<nodename>_sasl.log(<nodename>在默认情况下是rabbit@{hostname})。 其中<nodename>.log包含RabbitMQ日志,而<nodename>_sasl.log包含运行时日志,大多是未处理的异常。
从RabbitMQ3.7.0开始,这两个文件被合并,现在可以在.log文件中找到所有错误。因此不再使用RABBITMQ_SASL_LOGS环境变量。
如果log_levels Key存在于rabbitmq.config配置文件,它应该更新为使用日志类别。
如果日志类别没有定义,rabbit.log_levels将只工作在RabbitMQ 3.7.0版本中。

监视内部事件

RabbitMQ节点有一个内部机制。它的一些事件可以用于监视、审计和故障排除。它们可以通过一个插件rabbitmq-event-exchange公开给应用程序使用。 事件以带有空白实体的消息形式发布。所有事件元数据都存储在消息元数据(属性、标头)中。
下面是已发布事件的列表:
Queue, Exchange and Binding events:

queue.deleted  
queue.created  
exchange.created  
exchange.deleted  
binding.created  
binding.deleted  
复制代码

Connection and Channel events:

connection.created
connection.closed
channel.created
channel.closed
复制代码

Consumer events:

consumer.created
consumer.deleted
复制代码

Policy and Parameter events:

policy.set
policy.cleared
parameter.set
parameter.cleared
复制代码

Virtual host events:

vhost.created
vhost.deleted
vhost.limits.set
vhost.limits.cleared
复制代码

User management events:

user.authentication.success
user.authentication.failure
user.created
user.deleted
user.password.changed
user.password.cleared
user.tags.set
复制代码

Permission events:

permission.created
permission.deleted
topic.permission.created
topic.permission.deleted
复制代码

Alarm events:

alarm.set
alarm.cleared
复制代码

Shovel Plugin
Worker events:

shovel.worker.status
shovel.worker.removed
复制代码

Federation Plugin
Link events:

federation.link.status
federation.link.removed
复制代码

高级配置

本节描述日志子系统的细节。大多数RabbitMQ安装不需要这里介绍的高级配置。

Lager处理器和接收器

RabbitMQ日志子系统构建在Lager的基础上,Lager是一个功能强大的日志库,具有几个高级特性。其中一些可以通过日志处理程序和接收器抽象访问。
接收器是一个“端点”,其中的日志条目由连接、队列等写入。处理程序是有状态的实体,它使用日志条目并处理它们。例如,处理程序可以将日志条目写入文件、将它们发送到日志收集服务或丢弃它们。
默认情况下,RabbitMQ为每个日志类别创建一个文件后端处理程序和一个接收器(见上文)。更改RabbitMQ日志配置参数将更改底层使用的日志处理程序。RabbitMQ核心使用的接收器数量是固定的。第三方插件可以使用自定义接收器。通过一定数量的配置,可以将这些消息与其他消息分开记录。
当RabbitMQ使用默认的日志设置启动时,在底层配置了一个Lager处理程序,它看起来是这样的:

[{lager, [
    {handlers,
       [{lager_file_backend,
            [{file,
                 "/var/log/rabbitmq/log/rabbit.log"},
             {formatter_config,
                 [date," ",time," ",color,"[",severity,"] ",
                  {pid,[]},
                  " ",message,"\n"]},
             {level,info},
             {date,""},
             {size,0}]}]},
    {extra_sinks,
       [{error_logger_lager_event,
            [{handlers, [{lager_forwarder_backend,[lager_event,inherit]}]}]},
        {rabbit_log_lager_event,
            [{handlers, [{lager_forwarder_backend,[lager_event,inherit]}]}]},
        {rabbit_log_channel_lager_event,
            [{handlers, [{lager_forwarder_backend,[lager_event,inherit]}]}]},
        {rabbit_log_connection_lager_event,
            [{handlers, [{lager_forwarder_backend,[lager_event,inherit]}]}]},
        {rabbit_log_mirroring_lager_event,
            [{handlers, [{lager_forwarder_backend,[lager_event,inherit]}]}]},
        {rabbit_log_queue_lager_event,
            [{handlers, [{lager_forwarder_backend,[lager_event,inherit]}]}]},
        {rabbit_log_federation_lager_event,
            [{handlers, [{lager_forwarder_backend,[lager_event,inherit]}]}]},
        {rabbit_log_upgrade_lager_event,
            [{handlers,
                [{lager_file_backend,
                    [{date,[]},
                     {file,
                           "/var/log/rabbitmq/rabbit_upgrade.log"},
                     {formatter_config,
                        [date," ",time," ",color,"[",severity,
                         "] ",
                         {pid,[]},
                         " ",message,"\n"]},
                     {level,info},
                     {size,0}]}]}]}]}
]}]
复制代码

大多数接收器使用lager_forwarding后端。该后端将所有匹配级别的消息重定向到默认的lager sink (lager_event)。升级消息使用一个单独的接收器和它自己的日志文件。例如,如果启用了控制台日志记录:

log.console = true
log.console.level = warning
复制代码

然后生成的处理程序配置如下:

[{lager,
    [{handlers,
        [{lager_console_backend,
            [{formatter_config,[date," ", time," ",color,"[",severity,"] ", {pid,[]}, " ",message,"\n"]},
             {level,warning}]},
         {lager_file_backend,
            [{date,[]},
            {file,"/var/folders/cl/jnydxpf92rg76z05m12hlly80000gq/T/rabbitmq-test-instances/rabbit/log/rabbit.log"},
            {formatter_config,[date," ",time," ",color,"[",severity, "] ", {pid,[]}, " ",message,"\n"]},
            {level,info},
            {size,0}]
        }]},
     {extra_sinks,
        [{error_logger_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event, inherit]}]}]},
         {rabbit_log_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,
                                                                       inherit]}]}]},
         {rabbit_log_channel_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,
                                                                               inherit]}]}]},
         {rabbit_log_connection_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,
                                                                                  inherit]}]}]},
         {rabbit_log_mirroring_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,
                                                                                 inherit]}]}]},
         {rabbit_log_queue_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,
                                                                             inherit]}]}]},
         {rabbit_log_federation_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,
                                                                                  inherit]}]}]},
         {rabbit_log_upgrade_lager_event,
            [{handlers,
                [{lager_console_backend,
                    [{formatter_config,[date," ", time," ",color,"[",severity,"] ", {pid,[]}, " ",message,"\n"]},
                     {level,warning}]},
                 {lager_file_backend,
                    [{date,[]},
                     {file,"/var/folders/cl/jnydxpf92rg76z05m12hlly80000gq/T/rabbitmq-test-instances/rabbit/log/rabbit_upgrade.log"},
                     {formatter_config,[date," ", time," ",color,"[",severity,"] ", {pid,[]}, " ",message,"\n"]},
                     {level,info},
                     {size,0}]}]}]
         }]
    }]
}]
复制代码

这里,一个新的处理程序被添加到处理程序和upgrade_lager_event接收器处理程序中。因为升级类别在默认情况下使用单独的文件,所以所有默认处理程序都复制到接收器处理程序。
如果通过log.<category>.file配置条目为一个日志分类配置目标日志文件,该类别中的所有日志消息将仅写入此文件以及非文件后端。
若要在默认日志文件中包含升级日志,请禁用该类别的文件日志记录。

log.upgrade.file = false
复制代码

或者

[{rabbit, [{log, [{categories, [{upgrade, [{file, false}]}]}]}]}]
复制代码

日志记录设置必须进入lager应用程序部分。要将额外的处理程序添加到默认配置或接收,请使用处理程序添加到extra_sink键。
lager配置中配置的处理程序将与RabbitMQ生成的处理程序合并。日志消息将由自定义处理程序和标准处理程序记录。
如果接收器使用已知RabbitMQ类别的名称,则其处理程序将与生成的类别接收器合并。类别中的日志消息将发送到自定义处理程序和默认接收器。
可以禁用RabbitMQ处理程序和接收器。将处理程序或类别的级别设置为none将禁用它们。

自定义处理程序

若要仅为错误创建附加日志文件,请创建具有错误级别的附加处理程序。这必须使用先进的配置文件:

[{lager, [
    {handlers, [
        {lager_file_backend,
            [{file, "rabbit_errors.log"},
             {level,error},
             %% The formatter and rotation config is optional
             {formatter_config,
                 [date," ",time," ",color,"[",severity,"] ",
                  {pid,[]},
                  " ",message,"\n"]},
             {date,""},
             {size,0}]}
    ]}]
}]
复制代码

使用自定义lager后端和禁用RabbitMQ默认处理程序:

[{lager,
    [{handlers,
        [{lager_custom_backend,
            [{level,info},
             {custom,settings}]}]
    }]},
 {rabbit,
    [{log,
        [{file, [{file, false}]}] %% Disable RabbitMQ file handler
    }]}
]
复制代码

将Erlang AMQP 0-9-1客户端消息直接记录到控制台而不是默认输出:

[{lager,
    [{extra_sinks,
        [{rabbit_log_connection_lager_event,
            [{handlers,
                [{lager_console_backend, info}]}]}]
    }]},
 {rabbit,
    [{log,
        [{categories,
            [{connection, [{level, none}]}]}] %% Block connection category forwarder
    }]}
]
复制代码

上一篇:RabbitMQ系列(七)RabbitMQ的参数与策略
下一篇:RabbitMQ系列(九)分布式RabbitMQ概述