日志子系统AMQP附加器
该框架为一些流行的日志子系统提供了日志附加程序:
-
logback(自 Spring AMQP 1.4 版本起)
-
log4j2(自春季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 |
Truststore类型。 |
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 Appender
以下示例展示了如何配置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默认不创建线程安全事件。
如果经纪人倒下, |
日志回溯附录
以下示例展示了如何配置日志回溯附加器:
<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编码器,支持以下条件编码器选择。
这编码器和布局这些选项是互斥的。
定制消息
默认情况下,AMQP 附加词会填充以下消息属性:
-
传递模式 -
内容类型
-
内容编码,如果配置为 -
messageId(信息ID如果生成ID配置为 -
时间戳对数事件 -
应用,如果applicationId配置为
此外,它们还会填充以下值:
-
类别名称对数事件 -
对数事件的级别
-
线:日志事件发生的线程名称 -
日志事件调用栈跟踪的位置
-
所有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 管理界面上。
日志回溯高级技术
你可以子类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。
对于如前例所示的字符串属性,可以使用上述技术。
子类允许添加更丰富的性质(例如添加地图或数值属性)。
提供自定义队列实现
这AmqpAppenders使用一个阻塞队列异步地向RabbitMQ发布日志事件。
默认情况下,链接阻挡队列被使用。
不过,你可以提供任何类型的定制阻塞队列实现。
以下示例展示了如何实现Logback:
public class MyEnhancedAppender extends AmqpAppender {
@Override
protected BlockingQueue<Event> createEventQueue() {
return new ArrayBlockingQueue();
}
}
Log4j 2 附加功能支持使用阻塞队列工厂,如下示例所示:
<Appenders>
...
<RabbitMQ name="rabbitmq"
bufferSize="10" ... >
<ArrayBlockingQueue/>
</RabbitMQ>
</Appenders>