该框架为一些流行的日志记录子系统提供了日志记录附加器:
-
logback(从 Spring AMQP 版本 1.4 开始)
-
log4j2(从 Spring AMQP 版本 1.6 开始)
追加器是使用日志记录子系统的常规机制配置的,可用属性在以下各节中指定。
通用属性
以下属性可用于所有追加器:
财产 | 违约 | 描述 |
---|---|---|
exchangeName |
logs |
要向其发布日志事件的交换的名称。 |
exchangeType |
topic |
要向其发布日志事件的交换的类型 — 仅当追加者声明交换时才需要。
看。 |
routingKeyPattern |
%c.%p |
用于生成路由密钥的日志记录子系统模式格式。 |
applicationId |
应用程序 ID — 如果模式包含 ,则添加到路由键中。 |
|
senderPoolSize |
2 |
用于发布日志事件的线程数。 |
maxSenderRetries |
30 |
如果代理不可用或存在其他错误,则重试发送消息的次数。
重试延迟如下: ,其中 是重试次数。 |
addresses |
以逗号分隔的代理地址列表,格式如下: - 覆盖 和 。 |
|
host |
localhost |
要连接到的 RabbitMQ 主机。 |
port |
5672 |
要连接到的 RabbitMQ 端口。 |
virtualHost |
/ |
要连接到的 RabbitMQ 虚拟主机。 |
username |
guest |
连接时要使用的 RabbitMQ 用户。 |
password |
guest |
此用户的 RabbitMQ 密码。 |
useSsl |
false |
是否使用 SSL 进行 RabbitMQ 连接。
请参阅 |
verifyHostname |
true |
为 TLS 连接启用服务器主机名验证。
请参阅 |
sslAlgorithm |
null |
要使用的 SSL 算法。 |
sslPropertiesLocation |
null |
SSL 属性文件的位置。 |
keyStore |
null |
密钥库的位置。 |
keyStorePassphrase |
null |
密钥库的密码。 |
keyStoreType |
JKS |
密钥库类型。 |
trustStore |
null |
信任库的位置。 |
trustStorePassphrase |
null |
信任库的密码。 |
trustStoreType |
JKS |
信任库类型。 |
saslConfig |
null (RabbitMQ client default applies) |
这 - 请参阅 javadoc 以获取有效值。 |
contentType |
text/plain |
|
contentEncoding |
|
|
declareExchange |
false |
是否在此追加程序启动时声明配置的交换。
另请参见 和 。 |
durable |
true |
当 为 时,持久标志将设置为此值。 |
autoDelete |
false |
当 为 时,自动删除标志将设置为此值。 |
charset |
null |
转换为 时要使用的字符集。
默认值:null(使用系统默认字符集)。
如果当前平台不支持字符集,我们将回退到使用系统字符集。 |
deliveryMode |
PERSISTENT |
|
generateId |
false |
用于确定属性是否设置为唯一值。 |
clientConnectionProperties |
null |
以逗号分隔的对列表,用于 RabbitMQ 连接的自定义客户端属性。 |
addMdcAsHeaders |
true |
在引入此属性之前,MDC 属性始终添加到 RabbitMQ 消息头中。
这可能会导致大型 MDC 出现问题,因为 RabbitMQ 对所有标头的缓冲区大小有限,并且此缓冲区非常小。
引入此属性是为了避免在大型 MDC 的情况下出现问题。
默认情况下,此值设置为向后兼容。
关闭将 MDC 序列化为标头。
请注意,默认情况下会将 MDC 添加到消息中。 |
财产 | 违约 | 描述 |
---|---|---|
exchangeName |
logs |
要向其发布日志事件的交换的名称。 |
exchangeType |
topic |
要向其发布日志事件的交换的类型 — 仅当追加者声明交换时才需要。
看。 |
routingKeyPattern |
%c.%p |
用于生成路由密钥的日志记录子系统模式格式。 |
applicationId |
应用程序 ID — 如果模式包含 ,则添加到路由键中。 |
|
senderPoolSize |
2 |
用于发布日志事件的线程数。 |
maxSenderRetries |
30 |
如果代理不可用或存在其他错误,则重试发送消息的次数。
重试延迟如下: ,其中 是重试次数。 |
addresses |
以逗号分隔的代理地址列表,格式如下: - 覆盖 和 。 |
|
host |
localhost |
要连接到的 RabbitMQ 主机。 |
port |
5672 |
要连接到的 RabbitMQ 端口。 |
virtualHost |
/ |
要连接到的 RabbitMQ 虚拟主机。 |
username |
guest |
连接时要使用的 RabbitMQ 用户。 |
password |
guest |
此用户的 RabbitMQ 密码。 |
useSsl |
false |
是否使用 SSL 进行 RabbitMQ 连接。
请参阅 |
verifyHostname |
true |
为 TLS 连接启用服务器主机名验证。
请参阅 |
sslAlgorithm |
null |
要使用的 SSL 算法。 |
sslPropertiesLocation |
null |
SSL 属性文件的位置。 |
keyStore |
null |
密钥库的位置。 |
keyStorePassphrase |
null |
密钥库的密码。 |
keyStoreType |
JKS |
密钥库类型。 |
trustStore |
null |
信任库的位置。 |
trustStorePassphrase |
null |
信任库的密码。 |
trustStoreType |
JKS |
信任库类型。 |
saslConfig |
null (RabbitMQ client default applies) |
这 - 请参阅 javadoc 以获取有效值。 |
contentType |
text/plain |
|
contentEncoding |
|
|
declareExchange |
false |
是否在此追加程序启动时声明配置的交换。
另请参见 和 。 |
durable |
true |
当 为 时,持久标志将设置为此值。 |
autoDelete |
false |
当 为 时,自动删除标志将设置为此值。 |
charset |
null |
转换为 时要使用的字符集。
默认值:null(使用系统默认字符集)。
如果当前平台不支持字符集,我们将回退到使用系统字符集。 |
deliveryMode |
PERSISTENT |
|
generateId |
false |
用于确定属性是否设置为唯一值。 |
clientConnectionProperties |
null |
以逗号分隔的对列表,用于 RabbitMQ 连接的自定义客户端属性。 |
addMdcAsHeaders |
true |
在引入此属性之前,MDC 属性始终添加到 RabbitMQ 消息头中。
这可能会导致大型 MDC 出现问题,因为 RabbitMQ 对所有标头的缓冲区大小有限,并且此缓冲区非常小。
引入此属性是为了避免在大型 MDC 的情况下出现问题。
默认情况下,此值设置为向后兼容。
关闭将 MDC 序列化为标头。
请注意,默认情况下会将 MDC 添加到消息中。 |
Log4j 2 Appender
以下示例演示如何配置 Log4j 2 appender:
<Appenders>
...
<RabbitMQ name="rabbitmq"
addresses="foo:5672,bar:5672" user="guest" password="guest" virtualHost="/"
exchange="log4j2" exchangeType="topic" declareExchange="true" durable="true" autoDelete="false"
applicationId="myAppId" routingKeyPattern="%X{applicationId}.%c.%p"
contentType="text/plain" contentEncoding="UTF-8" generateId="true" deliveryMode="NON_PERSISTENT"
charset="UTF-8"
senderPoolSize="3" maxSenderRetries="5"
addMdcAsHeaders="false">
</RabbitMQ>
</Appenders>
从版本 1.6.10 和 1.7.3 开始,默认情况下,log4j2 appender 在调用线程上将消息发布到 RabbitMQ。
这是因为默认情况下,Log4j 2 不会创建线程安全事件。
如果代理关闭,则用于重试,重试之间没有延迟。
如果要恢复以前在单独的线程 () 上发布消息的行为,可以将该属性设置为 。
但是,您还需要将 Log4j 2 配置为使用 而不是 .
一种方法是设置 system 属性 .
如果将异步发布与 一起使用,则事件很有可能因串扰而损坏。 |
从版本 1.6.10 和 1.7.3 开始,默认情况下,log4j2 appender 在调用线程上将消息发布到 RabbitMQ。
这是因为默认情况下,Log4j 2 不会创建线程安全事件。
如果代理关闭,则用于重试,重试之间没有延迟。
如果要恢复以前在单独的线程 () 上发布消息的行为,可以将该属性设置为 。
但是,您还需要将 Log4j 2 配置为使用 而不是 .
一种方法是设置 system 属性 .
如果将异步发布与 一起使用,则事件很有可能因串扰而损坏。 |
Logback Appender
以下示例演示如何配置 logback appender:
<appender name="AMQP" class="org.springframework.amqp.rabbit.logback.AmqpAppender">
<layout>
<pattern><![CDATA[ %d %p %t [%c] - <%m>%n ]]></pattern>
</layout>
<addresses>foo:5672,bar:5672</addresses>
<abbreviation>36</abbreviation>
<includeCallerData>false</includeCallerData>
<applicationId>myApplication</applicationId>
<routingKeyPattern>%property{applicationId}.%c.%p</routingKeyPattern>
<generateId>true</generateId>
<charset>UTF-8</charset>
<durable>false</durable>
<deliveryMode>NON_PERSISTENT</deliveryMode>
<declareExchange>true</declareExchange>
<addMdcAsHeaders>false</addMdcAsHeaders>
</appender>
从版本 1.7.1 开始,Logback 提供了一个选项,这是默认的。
提取调用方数据可能相当昂贵,因为日志事件必须创建一个可抛出对象并对其进行检查以确定调用位置。
因此,默认情况下,当事件添加到事件队列时,不会提取与事件关联的调用方数据。
可以通过将属性设置为 来配置 appender 以包含调用方数据。AmqpAppender
includeCallerData
false
includeCallerData
true
从版本 2.0.0 开始,Logback 支持带有选项的 Logback 编码器。
和选项是互斥的。AmqpAppender
encoder
encoder
layout
自定义消息
默认情况下,AMQP 追加器填充以下消息属性:
-
deliveryMode
-
内容类型
-
contentEncoding
,如果已配置 -
messageId
,如果已配置generateId
-
timestamp
日志事件 -
appId
,如果配置了 applicationId
此外,它们还使用以下值填充标头:
-
categoryName
日志事件 -
日志事件的级别
-
thread
:发生日志事件的线程的名称 -
日志事件调用的堆栈跟踪的位置
-
所有 MDC 属性的副本(除非设置为
addMdcAsHeaders
false
)
每个追加器都可以进行子类化,以便您在发布之前修改消息。 以下示例演示如何自定义日志消息:
public class MyEnhancedAppender extends AmqpAppender {
@Override
public Message postProcessMessageBeforeSend(Message message, Event event) {
message.getMessageProperties().setHeader("foo", "bar");
return message;
}
}
从 2.2.4 开始,log4j2 也可以使用和扩展AmqpAppender
@PluginBuilderFactory
AmqpAppender.Builder
@Plugin(name = "MyEnhancedAppender", category = "Core", elementType = "appender", printObject = true)
public class MyEnhancedAppender extends AmqpAppender {
public MyEnhancedAppender(String name, Filter filter, Layout<? extends Serializable> layout,
boolean ignoreExceptions, AmqpManager manager, BlockingQueue<Event> eventQueue, String foo, String bar) {
super(name, filter, layout, ignoreExceptions, manager, eventQueue);
@Override
public Message postProcessMessageBeforeSend(Message message, Event event) {
message.getMessageProperties().setHeader("foo", "bar");
return message;
}
@PluginBuilderFactory
public static Builder newBuilder() {
return new Builder();
}
protected static class Builder extends AmqpAppender.Builder {
@Override
protected AmqpAppender buildInstance(String name, Filter filter, Layout<? extends Serializable> layout,
boolean ignoreExceptions, AmqpManager manager, BlockingQueue<Event> eventQueue) {
return new MyEnhancedAppender(name, filter, layout, ignoreExceptions, manager, eventQueue);
}
}
}
自定义客户端属性
可以通过添加字符串属性或更复杂的属性来添加自定义客户端属性。
简单字符串属性
每个 appender 都支持将客户端属性添加到 RabbitMQ 连接。
以下示例演示如何为 logback 添加自定义客户端属性:
<appender name="AMQP" ...>
...
<clientConnectionProperties>thing1:thing2,cat:hat</clientConnectionProperties>
...
</appender>
<Appenders>
...
<RabbitMQ name="rabbitmq"
...
clientConnectionProperties="thing1:thing2,cat:hat"
...
</RabbitMQ>
</Appenders>
这些属性是以逗号分隔的对列表。
键和值不能包含逗号或冒号。key:value
查看连接时,这些属性将显示在 RabbitMQ 管理 UI 上。
先进的回log技术
您可以对 Logback appender 进行子类化。 这样做可以在建立连接之前修改客户端连接属性。 以下示例演示如何执行此操作:
public class MyEnhancedAppender extends AmqpAppender {
private String thing1;
@Override
protected void updateConnectionClientProperties(Map<String, Object> clientProperties) {
clientProperties.put("thing1", this.thing1);
}
public void setThing1(String thing1) {
this.thing1 = thing1;
}
}
然后,您可以添加到logback.xml。<thing1>thing2</thing1>
对于前面示例中所示的 String 属性,可以使用前面的技术。
子类允许添加更丰富的属性(例如添加 或 numeric 属性)。Map
提供自定义队列实现
使用 a 将日志记录事件异步发布到 RabbitMQ。
默认情况下,使用 a。
但是,您可以提供任何类型的自定义实现。AmqpAppenders
BlockingQueue
LinkedBlockingQueue
BlockingQueue
以下示例显示了如何对 Logback 执行此操作:
public class MyEnhancedAppender extends AmqpAppender {
@Override
protected BlockingQueue<Event> createEventQueue() {
return new ArrayBlockingQueue();
}
}
Log4j 2 appender 支持使用 BlockingQueueFactory
,如以下示例所示:
<Appenders>
...
<RabbitMQ name="rabbitmq"
bufferSize="10" ... >
<ArrayBlockingQueue/>
</RabbitMQ>
</Appenders>