该版本仍在开发中,尚未被视为稳定。请使用最新的稳定版本,使用 Spring AMQP 4.0.0!spring-doc.cadn.net.cn

日志子系统AMQP附加器

该框架为一些流行的日志子系统提供了日志附加程序:spring-doc.cadn.net.cn

附加程序通过日志子系统的常规机制进行配置,可用的属性将在以下章节中详细说明。spring-doc.cadn.net.cn

常见性质

以下房产适用于所有附录:spring-doc.cadn.net.cn

表1。常见附录性质
属性 默认值 描述
 exchangeName
 logs

发布日志事件的交易所名称。spring-doc.cadn.net.cn

 exchangeType
 topic

发布日志事件的交换类型——仅在附加方声明交换时才需要。 看声明交换.spring-doc.cadn.net.cn

 routingKeyPattern
 %c.%p

用于生成路由密钥的日志子系统模式格式。spring-doc.cadn.net.cn

 applicationId

应用ID——如果模式包含,则添加到路由密钥中%X{applicationId}.spring-doc.cadn.net.cn

 senderPoolSize
 2

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

 maxSenderRetries
 30

如果经纪人无法接听或者出现其他错误,应该重试发送消息多少次? 重考延迟如下:N ^ log(N)哪里N是重试编号。spring-doc.cadn.net.cn

 addresses

以下形式的经纪人地址逗号分隔列表:主持人:端口[,主机:端口]*-重写主机端口.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。 看兔子连接工厂豆以及配置SSLspring-doc.cadn.net.cn

 verifyHostname
 true

启用TLS连接的服务器主机名验证。 看兔子连接工厂豆以及配置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

Truststore类型。spring-doc.cadn.net.cn

 saslConfig
 null (RabbitMQ client default applies)

saslConfig- 参见 Java 文档RabbitUtils.stringToSaslConfig为了有效的价值观。spring-doc.cadn.net.cn

 contentType
 text/plain

内容类型日志消息的属性。spring-doc.cadn.net.cn

 contentEncoding

内容编码日志消息的属性。spring-doc.cadn.net.cn

 declareExchange
 false

是否在这个附加词开始时声明配置交换。 参见耐用自动删除.spring-doc.cadn.net.cn

 durable
 true

什么时候声明交换true,持久标志设置为此值。spring-doc.cadn.net.cn

 autoDelete
 false

什么时候声明交换true,自动删除标志设置为该值。spring-doc.cadn.net.cn

 charset
 null

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

 deliveryMode
 PERSISTENT

持续NON_PERSISTENT以确定RabbitMQ是否应持久化这些消息。spring-doc.cadn.net.cn

 generateId
 false

用于确定messageId(信息ID属性被设定为唯一值。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 Appender

以下示例展示了如何配置Log4j 2附加器: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附加程序会在调用线程上向RabbitMQ发布消息。 这是因为Log4j 2默认不创建线程安全事件。 如果经纪人倒下,maxSender重试用于重试,且重试之间无延迟。 如果你想恢复之前在不同线程上发布消息的行为 (senderPoolSize),你可以设置异步属性到true. 不过,你还需要配置Log4j 2来使用默认日志事件工厂而不是可重用日志事件工厂. 一种方法是设置系统属性-Dlog4j2.enable.threadlocals=false. 如果你使用异步发布可重用日志事件工厂事件因串联而被破坏的可能性很高。spring-doc.cadn.net.cn

日志回溯附录

以下示例展示了如何配置日志回溯附加器: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默认。 提取调用者数据可能相当昂贵,因为日志事件必须创建投掷文件并检查以确定调用位置。 因此,默认情况下,当事件加入事件队列时,与事件相关的调用者数据不会被提取。 你可以通过设置includeCallerData属性到true.spring-doc.cadn.net.cn

从2.0.0版本开始,LogbackAmqpAppender支持Logback编码器,支持以下条件编码器选择。 这编码器布局这些选项是互斥的。spring-doc.cadn.net.cn

定制消息

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

此外,它们还会填充以下值:spring-doc.cadn.net.cn

每个附加内容都可以子类化,允许你在发布前修改消息。 以下示例展示了如何自定义日志消息: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

简单字符串性质

每个附加器都支持向 RabbitMQ 连接添加客户端属性。spring-doc.cadn.net.cn

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

<appender name="AMQP" ...>
    ...
    <clientConnectionProperties>thing1:thing2,cat:hat</clientConnectionProperties>
    ...
</appender>
log4j2
<Appenders>
    ...
    <RabbitMQ name="rabbitmq"
        ...
        clientConnectionProperties="thing1:thing2,cat:hat"
        ...
    </RabbitMQ>
</Appenders>

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

这些属性在查看连接时会出现在 RabbitMQ 管理界面上。spring-doc.cadn.net.cn

日志回溯高级技术

你可以子类Logback的附加器。 这样做可以在连接建立之前修改客户端连接属性。 以下示例展示了如何实现: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

对于如前例所示的字符串属性,可以使用上述技术。 子类允许添加更丰富的性质(例如添加地图或数值属性)。spring-doc.cadn.net.cn

提供自定义队列实现

AmqpAppenders使用一个阻塞队列异步地向RabbitMQ发布日志事件。 默认情况下,链接阻挡队列被使用。 不过,你可以提供任何类型的定制阻塞队列实现。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 附加功能支持使用阻塞队列工厂,如下示例所示:spring-doc.cadn.net.cn

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