| 
         此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring AMQP 3.2.6!  | 
    
日志记录子系统 AMQP 附加器
该框架为一些流行的日志记录子系统提供了日志记录附加程序:
- 
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  | 
是否对 RabbitMQ 连接使用 SSL。
看  | 
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)  | 
这  | 
contentType  | 
text/plain  | 
  | 
contentEncoding  | 
  | 
|
declareExchange  | 
false  | 
是否在此附加器启动时声明已配置的交换。
也可以看看  | 
durable  | 
true  | 
什么时候  | 
autoDelete  | 
false  | 
什么时候  | 
charset  | 
null  | 
转换时要使用的字符集  | 
deliveryMode  | 
PERSISTENT  | 
  | 
generateId  | 
false  | 
用于确定  | 
clientConnectionProperties  | 
null  | 
以逗号分隔的列表  | 
addMdcAsHeaders  | 
true  | 
在引入此属性之前,MDC 属性始终被添加到 RabbitMQ 消息标头中。它可能会导致大 MDC 出现问题,因为 RabbitMQ 对所有标头的缓冲区大小有限,而且这个缓冲区非常小。引入此属性是为了避免在大 MDC 的情况下出现问题。默认情况下,此值设置为  | 
Log4j 2 附加器
以下示例显示了如何配置 Log4j 2 附加器:
<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 附加器将消息发布到调用线程上的 RabbitMQ。这是因为默认情况下,Log4j 2 不会创建线程安全事件。如果代理关闭,则  | 
Logback Appender
以下示例显示了如何配置 logback 附加器:
<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 版本开始,LogbackAmqpAppender提供includeCallerData选项,即false默认情况下。提取调用方数据可能相当昂贵,因为日志事件必须创建一个可抛出项并检查它以确定调用位置。因此,默认情况下,当事件添加到事件队列时,不会提取与事件关联的调用方数据。您可以通过将includeCallerData属性设置为true.
从 2.0.0 版本开始,LogbackAmqpAppender支持 Logback 编码器,其中包含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 开始,log4j2AmqpAppender可以使用@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);
		}
	}
}
自定义客户端属性
可以通过添加字符串属性或更复杂的属性来添加自定义客户端属性。
简单字符串属性
每个附加器都支持将客户端属性添加到 RabbitMQ 连接。
以下示例演示如何添加自定义客户端属性:
- 
logback
 - 
log4j2
 
<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 上。
高级回登录技术
您可以对 Logback 附加程序进行子类化。 这样做可以在建立连接之前修改客户端连接属性。 以下示例显示了如何执行此作:
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;
    }
}
然后你可以添加<thing1>thing2</thing1>logback.xml。
对于 String 属性(如前面示例中所示的属性),可以使用前面的技术。
子类允许添加更丰富的属性(例如添加Map或数字属性)。
提供自定义队列实现
这AmqpAppenders使用BlockingQueue以异步将日志事件发布到 RabbitMQ。
默认情况下,一个LinkedBlockingQueue被使用。
但是,您可以提供任何类型的定制BlockingQueue实现。
以下示例显示了如何为 Logback 执行此作:
public class MyEnhancedAppender extends AmqpAppender {
    @Override
    protected BlockingQueue<Event> createEventQueue() {
        return new ArrayBlockingQueue();
    }
}
Log4j 2 附加器支持使用BlockingQueueFactory,如以下示例所示:
<Appenders>
    ...
    <RabbitMQ name="rabbitmq"
              bufferSize="10" ... >
        <ArrayBlockingQueue/>
    </RabbitMQ>
</Appenders>