该框架为一些流行的日志记录子系统提供了日志记录附加器:Spring中文文档

追加器是使用日志记录子系统的常规机制配置的,可用属性在以下各节中指定。Spring中文文档

通用属性

以下属性可用于所有追加器:Spring中文文档

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

要向其发布日志事件的交换的名称。Spring中文文档

 exchangeType
 topic

要向其发布日志事件的交换的类型 — 仅当追加者声明交换时才需要。 看。declareExchangeSpring中文文档

 routingKeyPattern
 %c.%p

用于生成路由密钥的日志记录子系统模式格式。Spring中文文档

 applicationId

应用程序 ID — 如果模式包含 ,则添加到路由键中。%X{applicationId}Spring中文文档

 senderPoolSize
 2

用于发布日志事件的线程数。Spring中文文档

 maxSenderRetries
 30

如果代理不可用或存在其他错误,则重试发送消息的次数。 重试延迟如下: ,其中 是重试次数。N ^ log(N)NSpring中文文档

 addresses

以逗号分隔的代理地址列表,格式如下: - 覆盖 和 。host:port[,host:port]*hostportSpring中文文档

 host
 localhost

要连接到的 RabbitMQ 主机。Spring中文文档

 port
 5672

要连接到的 RabbitMQ 端口。Spring中文文档

 virtualHost
 /

要连接到的 RabbitMQ 虚拟主机。Spring中文文档

 username
 guest

连接时要使用的 RabbitMQ 用户。Spring中文文档

 password
 guest

此用户的 RabbitMQ 密码。Spring中文文档

 useSsl
 false

是否使用 SSL 进行 RabbitMQ 连接。 请参阅 RabbitConnectionFactoryBean 和配置 SSLSpring中文文档

 verifyHostname
 true

为 TLS 连接启用服务器主机名验证。 请参阅 RabbitConnectionFactoryBean 和配置 SSLSpring中文文档

 sslAlgorithm
 null

要使用的 SSL 算法。Spring中文文档

 sslPropertiesLocation
 null

SSL 属性文件的位置。Spring中文文档

 keyStore
 null

密钥库的位置。Spring中文文档

 keyStorePassphrase
 null

密钥库的密码。Spring中文文档

 keyStoreType
 JKS

密钥库类型。Spring中文文档

 trustStore
 null

信任库的位置。Spring中文文档

 trustStorePassphrase
 null

信任库的密码。Spring中文文档

 trustStoreType
 JKS

信任库类型。Spring中文文档

 saslConfig
 null (RabbitMQ client default applies)

这 - 请参阅 javadoc 以获取有效值。saslConfigRabbitUtils.stringToSaslConfigSpring中文文档

 contentType
 text/plain

content-type日志消息的属性。Spring中文文档

 contentEncoding

content-encoding日志消息的属性。Spring中文文档

 declareExchange
 false

是否在此追加程序启动时声明配置的交换。 另请参见 和 。durableautoDeleteSpring中文文档

 durable
 true

当 为 时,持久标志将设置为此值。declareExchangetrueSpring中文文档

 autoDelete
 false

当 为 时,自动删除标志将设置为此值。declareExchangetrueSpring中文文档

 charset
 null

转换为 时要使用的字符集。 默认值:null(使用系统默认字符集)。 如果当前平台不支持字符集,我们将回退到使用系统字符集。Stringbyte[]Spring中文文档

 deliveryMode
 PERSISTENT

PERSISTENT或确定 RabbitMQ 是否应保留消息。NON_PERSISTENTSpring中文文档

 generateId
 false

用于确定属性是否设置为唯一值。messageIdSpring中文文档

 clientConnectionProperties
 null

以逗号分隔的对列表,用于 RabbitMQ 连接的自定义客户端属性。key:valueSpring中文文档

 addMdcAsHeaders
 true

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

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

要向其发布日志事件的交换的名称。Spring中文文档

 exchangeType
 topic

要向其发布日志事件的交换的类型 — 仅当追加者声明交换时才需要。 看。declareExchangeSpring中文文档

 routingKeyPattern
 %c.%p

用于生成路由密钥的日志记录子系统模式格式。Spring中文文档

 applicationId

应用程序 ID — 如果模式包含 ,则添加到路由键中。%X{applicationId}Spring中文文档

 senderPoolSize
 2

用于发布日志事件的线程数。Spring中文文档

 maxSenderRetries
 30

如果代理不可用或存在其他错误,则重试发送消息的次数。 重试延迟如下: ,其中 是重试次数。N ^ log(N)NSpring中文文档

 addresses

以逗号分隔的代理地址列表,格式如下: - 覆盖 和 。host:port[,host:port]*hostportSpring中文文档

 host
 localhost

要连接到的 RabbitMQ 主机。Spring中文文档

 port
 5672

要连接到的 RabbitMQ 端口。Spring中文文档

 virtualHost
 /

要连接到的 RabbitMQ 虚拟主机。Spring中文文档

 username
 guest

连接时要使用的 RabbitMQ 用户。Spring中文文档

 password
 guest

此用户的 RabbitMQ 密码。Spring中文文档

 useSsl
 false

是否使用 SSL 进行 RabbitMQ 连接。 请参阅 RabbitConnectionFactoryBean 和配置 SSLSpring中文文档

 verifyHostname
 true

为 TLS 连接启用服务器主机名验证。 请参阅 RabbitConnectionFactoryBean 和配置 SSLSpring中文文档

 sslAlgorithm
 null

要使用的 SSL 算法。Spring中文文档

 sslPropertiesLocation
 null

SSL 属性文件的位置。Spring中文文档

 keyStore
 null

密钥库的位置。Spring中文文档

 keyStorePassphrase
 null

密钥库的密码。Spring中文文档

 keyStoreType
 JKS

密钥库类型。Spring中文文档

 trustStore
 null

信任库的位置。Spring中文文档

 trustStorePassphrase
 null

信任库的密码。Spring中文文档

 trustStoreType
 JKS

信任库类型。Spring中文文档

 saslConfig
 null (RabbitMQ client default applies)

这 - 请参阅 javadoc 以获取有效值。saslConfigRabbitUtils.stringToSaslConfigSpring中文文档

 contentType
 text/plain

content-type日志消息的属性。Spring中文文档

 contentEncoding

content-encoding日志消息的属性。Spring中文文档

 declareExchange
 false

是否在此追加程序启动时声明配置的交换。 另请参见 和 。durableautoDeleteSpring中文文档

 durable
 true

当 为 时,持久标志将设置为此值。declareExchangetrueSpring中文文档

 autoDelete
 false

当 为 时,自动删除标志将设置为此值。declareExchangetrueSpring中文文档

 charset
 null

转换为 时要使用的字符集。 默认值:null(使用系统默认字符集)。 如果当前平台不支持字符集,我们将回退到使用系统字符集。Stringbyte[]Spring中文文档

 deliveryMode
 PERSISTENT

PERSISTENT或确定 RabbitMQ 是否应保留消息。NON_PERSISTENTSpring中文文档

 generateId
 false

用于确定属性是否设置为唯一值。messageIdSpring中文文档

 clientConnectionProperties
 null

以逗号分隔的对列表,用于 RabbitMQ 连接的自定义客户端属性。key:valueSpring中文文档

 addMdcAsHeaders
 true

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

Log4j 2 Appender

以下示例演示如何配置 Log4j 2 appender:Spring中文文档

<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 属性 . 如果将异步发布与 一起使用,则事件很有可能因串扰而损坏。maxSenderRetriessenderPoolSizeasynctrueDefaultLogEventFactoryReusableLogEventFactory-Dlog4j2.enable.threadlocals=falseReusableLogEventFactorySpring中文文档

从版本 1.6.10 和 1.7.3 开始,默认情况下,log4j2 appender 在调用线程上将消息发布到 RabbitMQ。 这是因为默认情况下,Log4j 2 不会创建线程安全事件。 如果代理关闭,则用于重试,重试之间没有延迟。 如果要恢复以前在单独的线程 () 上发布消息的行为,可以将该属性设置为 。 但是,您还需要将 Log4j 2 配置为使用 而不是 . 一种方法是设置 system 属性 . 如果将异步发布与 一起使用,则事件很有可能因串扰而损坏。maxSenderRetriessenderPoolSizeasynctrueDefaultLogEventFactoryReusableLogEventFactory-Dlog4j2.enable.threadlocals=falseReusableLogEventFactorySpring中文文档

Logback Appender

以下示例演示如何配置 logback appender:Spring中文文档

<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 以包含调用方数据。AmqpAppenderincludeCallerDatafalseincludeCallerDatatrueSpring中文文档

从版本 2.0.0 开始,Logback 支持带有选项的 Logback 编码器。 和选项是互斥的。AmqpAppenderencoderencoderlayoutSpring中文文档

自定义消息

默认情况下,AMQP 追加器填充以下消息属性:Spring中文文档

此外,它们还使用以下值填充标头:Spring中文文档

每个追加器都可以进行子类化,以便您在发布之前修改消息。 以下示例演示如何自定义日志消息:Spring中文文档

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@PluginBuilderFactoryAmqpAppender.BuilderSpring中文文档

@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中文文档

简单字符串属性

每个 appender 都支持将客户端属性添加到 RabbitMQ 连接。Spring中文文档

以下示例演示如何为 logback 添加自定义客户端属性:Spring中文文档

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

这些属性是以逗号分隔的对列表。 键和值不能包含逗号或冒号。key:valueSpring中文文档

查看连接时,这些属性将显示在 RabbitMQ 管理 UI 上。Spring中文文档

先进的回log技术

您可以对 Logback appender 进行子类化。 这样做可以在建立连接之前修改客户端连接属性。 以下示例演示如何执行此操作:Spring中文文档

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>Spring中文文档

对于前面示例中所示的 String 属性,可以使用前面的技术。 子类允许添加更丰富的属性(例如添加 或 numeric 属性)。MapSpring中文文档

提供自定义队列实现

使用 a 将日志记录事件异步发布到 RabbitMQ。 默认情况下,使用 a。 但是,您可以提供任何类型的自定义实现。AmqpAppendersBlockingQueueLinkedBlockingQueueBlockingQueueSpring中文文档

以下示例显示了如何对 Logback 执行此操作:Spring中文文档

public class MyEnhancedAppender extends AmqpAppender {

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

}

Log4j 2 appender 支持使用 BlockingQueueFactory,如以下示例所示:Spring中文文档

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