对于最新的稳定版本,请使用 Spring AMQP 3.2.0spring-doc.cadn.net.cn

日志记录子系统 AMQP 附加程序

该框架为一些流行的日志记录子系统提供了 logging appender:spring-doc.cadn.net.cn

appender 是使用 logging 子系统的正常机制配置的,可用属性在以下部分中指定。spring-doc.cadn.net.cn

常见属性

所有 appenders 都提供以下属性:spring-doc.cadn.net.cn

表 1.常见的 Appender 属性
财产 违约 描述
 exchangeName
 logs

要将日志事件发布到的 Exchange 的名称。spring-doc.cadn.net.cn

 exchangeType
 topic

要将日志事件发布到的 exchange 的类型 — 仅当 appender 声明 exchange 时才需要。 看declareExchange.spring-doc.cadn.net.cn

 routingKeyPattern
 %c.%p

用于生成路由密钥的 Logging subsystem 模式格式。spring-doc.cadn.net.cn

 applicationId

应用程序 ID — 如果模式包含%X{applicationId}.spring-doc.cadn.net.cn

 senderPoolSize
 2

用于发布日志事件的线程数。spring-doc.cadn.net.cn

 maxSenderRetries
 30

如果 Broker 不可用或出现其他错误,则重试发送消息的次数。 重试延迟如下:N ^ log(N)哪里N是重试编号。spring-doc.cadn.net.cn

 addresses

以下格式的代理地址列表(以逗号分隔):host:port[,host:port]*-重写hostport.spring-doc.cadn.net.cn

 host
 localhost

要连接到的 RabbitMQ 主机。spring-doc.cadn.net.cn

 port
 5672

要连接的 RabbitMQ 端口。spring-doc.cadn.net.cn

 virtualHost
 /

要连接到的 RabbitMQ 虚拟主机。spring-doc.cadn.net.cn

 username
 guest

RabbitMQ 用户。spring-doc.cadn.net.cn

 password
 guest

此用户的 RabbitMQ 密码。spring-doc.cadn.net.cn

 useSsl
 false

是否使用 SSL 进行 RabbitMQ 连接。 看RabbitConnectionFactoryBean和配置 SSLspring-doc.cadn.net.cn

 verifyHostname
 true

为 TLS 连接启用服务器主机名验证。 看RabbitConnectionFactoryBean和配置 SSLspring-doc.cadn.net.cn

 sslAlgorithm
 null

要使用的 SSL 算法。spring-doc.cadn.net.cn

 sslPropertiesLocation
 null

SSL 属性文件的位置。spring-doc.cadn.net.cn

 keyStore
 null

密钥库的位置。spring-doc.cadn.net.cn

 keyStorePassphrase
 null

密钥库的密码。spring-doc.cadn.net.cn

 keyStoreType
 JKS

密钥库类型。spring-doc.cadn.net.cn

 trustStore
 null

信任库的位置。spring-doc.cadn.net.cn

 trustStorePassphrase
 null

信任库的密码。spring-doc.cadn.net.cn

 trustStoreType
 JKS

信任库类型。spring-doc.cadn.net.cn

 saslConfig
 null (RabbitMQ client default applies)

saslConfig- 请参阅 Javadoc 以获取RabbitUtils.stringToSaslConfig以获取有效值。spring-doc.cadn.net.cn

 contentType
 text/plain

content-type日志消息的属性。spring-doc.cadn.net.cn

 contentEncoding

content-encoding日志消息的属性。spring-doc.cadn.net.cn

 declareExchange
 false

是否在此 appender 启动时声明配置的 exchange。 另请参阅durableautoDelete.spring-doc.cadn.net.cn

 durable
 true

什么时候declareExchangetrue,则 durable 标志将设置为此值。spring-doc.cadn.net.cn

 autoDelete
 false

什么时候declareExchangetrue,则 auto-delete 标志将设置为此值。spring-doc.cadn.net.cn

 charset
 null

转换时使用的字符集Stringbyte[]. 默认值:null(使用系统默认字符集)。 如果当前平台不支持该字符集,我们将回退到使用系统字符集。spring-doc.cadn.net.cn

 deliveryMode
 PERSISTENT

PERSISTENTNON_PERSISTENT来确定 RabbitMQ 是否应保留消息。spring-doc.cadn.net.cn

 generateId
 false

用于确定messageId属性设置为唯一值。spring-doc.cadn.net.cn

 clientConnectionProperties
 null

以逗号分隔的key:value对,用于自定义客户端属性到 RabbitMQ 连接。spring-doc.cadn.net.cn

 addMdcAsHeaders
 true

在引入此属性之前,MDC 属性始终添加到 RabbitMQ 消息头中。 这可能会导致大型 MDC 出现问题,因为 RabbitMQ 的所有标头的缓冲区大小有限,并且此缓冲区非常小。 引入此属性是为了避免在大型 MDC 的情况下出现问题。 默认情况下,此值设置为true以实现向后兼容性。 这false关闭将 MDC 序列化为标头。 请注意,JsonLayout默认情况下,将 MDC 添加到邮件中。spring-doc.cadn.net.cn

Log4j 2 附加程序

以下示例显示如何配置 Log4j 2 appender:spring-doc.cadn.net.cn

<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 默认情况下不会创建线程安全事件。 如果代理宕机,则maxSenderRetries用于重试,重试之间没有延迟。 如果您希望恢复以前在单独线程上发布消息的行为 (senderPoolSize),则可以设置asyncproperty 设置为true. 但是,您还需要将 Log4j 2 配置为使用DefaultLogEventFactory而不是ReusableLogEventFactory. 一种方法是将 system 属性-Dlog4j2.enable.threadlocals=false. 如果您使用异步发布和ReusableLogEventFactory,事件很有可能由于串扰而被损坏。spring-doc.cadn.net.cn

Logback Appender

以下示例显示如何配置 logback appender:spring-doc.cadn.net.cn

<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默认情况下。 提取调用者数据可能相当昂贵,因为 log event 必须创建一个 throwable 并检查它以确定调用位置。 因此,默认情况下,在将事件添加到事件队列时,不会提取与事件关联的调用方数据。 您可以通过设置includeCallerDataproperty 设置为true.spring-doc.cadn.net.cn

从版本 2.0.0 开始,LogbackAmqpAppender支持使用encoder选择。 这encoderlayout选项是互斥的。spring-doc.cadn.net.cn

自定义消息

默认情况下,AMQP 附加程序填充以下消息属性:spring-doc.cadn.net.cn

此外,它们还使用以下值填充标头:spring-doc.cadn.net.cn

每个 appender 都可以被子类化,从而允许您在发布之前修改消息。 以下示例显示如何自定义日志消息:spring-doc.cadn.net.cn

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.Builderspring-doc.cadn.net.cn

@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);
		}
	}

}

自定义客户端属性

您可以通过添加字符串属性或更复杂的属性来添加自定义客户端属性。spring-doc.cadn.net.cn

简单字符串属性

每个 appender 都支持将 Client 端属性添加到 RabbitMQ 连接。spring-doc.cadn.net.cn

以下示例显示了如何为 logback 添加自定义客户端属性:spring-doc.cadn.net.cn

<appender name="AMQP" ...>
    ...
    <clientConnectionProperties>thing1:thing2,cat:hat</clientConnectionProperties>
    ...
</appender>
对数 4j2
<Appenders>
    ...
    <RabbitMQ name="rabbitmq"
        ...
        clientConnectionProperties="thing1:thing2,cat:hat"
        ...
    </RabbitMQ>
</Appenders>

属性是以逗号分隔的key:value对。 键和值不能包含逗号或冒号。spring-doc.cadn.net.cn

查看连接时,这些属性将显示在 RabbitMQ Admin UI 上。spring-doc.cadn.net.cn

高级 Logback 技术

您可以将 Logback appender 子类化。 这样,您就可以在建立连接之前修改客户端连接属性。 以下示例显示了如何执行此作:spring-doc.cadn.net.cn

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。spring-doc.cadn.net.cn

对于 String 属性(如前面的示例中所示的属性),可以使用前面的技术。 子类允许添加更丰富的属性(例如添加Map或数字属性)。spring-doc.cadn.net.cn

提供自定义队列实现

AmqpAppenders使用BlockingQueue将日志记录事件异步发布到 RabbitMQ。 默认情况下,LinkedBlockingQueue被使用。 但是,您可以提供任何类型的自定义BlockingQueue实现。spring-doc.cadn.net.cn

以下示例显示了如何对 Logback 执行此作:spring-doc.cadn.net.cn

public class MyEnhancedAppender extends AmqpAppender {

    @Override
    protected BlockingQueue<Event> createEventQueue() {
        return new ArrayBlockingQueue();
    }

}

Log4j 2 appender 支持使用BlockingQueueFactory,如下例所示:spring-doc.cadn.net.cn

<Appenders>
    ...
    <RabbitMQ name="rabbitmq"
              bufferSize="10" ... >
        <ArrayBlockingQueue/>
    </RabbitMQ>
</Appenders>