日誌子系統 AMQP Appender
該框架為一些流行的日誌子系統提供了日誌 appender
-
logback(自 Spring AMQP 1.4 版起)
-
log4j2(自 Spring AMQP 1.6 版起)
Appender 透過日誌子系統的常規機制進行配置,可用屬性在以下部分中指定。
通用屬性
所有 appender 均提供以下屬性
| 財產 | 預設值 | 描述 |
|---|---|---|
exchangeName |
logs |
釋出日誌事件的交換機名稱。 |
exchangeType |
topic |
釋出日誌事件的交換機型別——僅當 appender 宣告交換機時才需要。請參閱 |
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 |
此 appender 啟動時是否宣告已配置的交換機。另請參閱 |
durable |
true |
當 |
autoDelete |
false |
當 |
charset |
null |
將 |
deliveryMode |
PERSISTENT |
|
generateId |
false |
用於確定 |
clientConnectionProperties |
null |
用於 RabbitMQ 連線的自定義客戶端屬性的逗號分隔 |
addMdcAsHeaders |
true |
MDC 屬性在引入此屬性之前始終新增到 RabbitMQ 訊息頭中。這可能會導致大型 MDC 出現問題,因為 RabbitMQ 為所有標頭檔案提供的緩衝區大小有限,而且這個緩衝區相當小。引入此屬性是為了避免大型 MDC 情況下的問題。預設情況下,此值設定為 |
Log4j 2 Appender
以下示例展示瞭如何配置 Log4j 2 appender
<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 預設不建立執行緒安全事件。如果代理關閉, |
Logback Appender
以下示例展示瞭如何配置 logback appender
<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 AmqpAppender 提供了一個 includeCallerData 選項,預設為 false。提取呼叫者資料可能相當耗費資源,因為日誌事件必須建立可丟擲物件並檢查它以確定呼叫位置。因此,預設情況下,當事件新增到事件佇列時,與事件關聯的呼叫者資料不會被提取。您可以透過將 includeCallerData 屬性設定為 true 來配置 appender 以包含呼叫者資料。
從 2.0.0 版本開始,Logback AmqpAppender 支援 Logback 編碼器,並提供 encoder 選項。encoder 和 layout 選項互斥。
自定義訊息
預設情況下,AMQP appender 填充以下訊息屬性
-
投遞模式 -
contentType
-
如果配置了
contentEncoding -
如果配置了
generateId,則為messageId -
日誌事件的
timestamp -
如果配置了 applicationId,則為
appId
此外,它們還使用以下值填充頭部
-
日誌事件的
categoryName -
日誌事件的級別
-
thread:發生日誌事件的執行緒名稱 -
日誌事件呼叫的堆疊跟蹤位置
-
所有 MDC 屬性的副本(除非將
addMdcAsHeaders設定為false)
每個 appender 都可以被子類化,讓您在釋出之前修改訊息。以下示例展示瞭如何自定義日誌訊息
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 可以使用 @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);
}
}
}
自定義客戶端屬性
您可以透過新增字串屬性或更復雜的屬性來新增自定義客戶端屬性。
簡單字串屬性
每個 appender 都支援向 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 Admin UI 上。
Logback 的高階技術
您可以子類化 Logback appender。這樣做可以讓您在建立連線之前修改客戶端連線屬性。以下示例展示瞭如何做到這一點
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。
對於像前面示例中所示的字串屬性,可以使用以前的技術。子類允許新增更豐富的屬性(例如新增 Map 或數字屬性)。
提供自定義佇列實現
AmqpAppenders 使用 BlockingQueue 非同步將日誌事件釋出到 RabbitMQ。預設情況下,使用 LinkedBlockingQueue。但是,您可以提供任何型別的自定義 BlockingQueue 實現。
以下示例展示瞭如何為 Logback 實現此功能
public class MyEnhancedAppender extends AmqpAppender {
@Override
protected BlockingQueue<Event> createEventQueue() {
return new ArrayBlockingQueue();
}
}
Log4j 2 appender 支援使用 BlockingQueueFactory,如以下示例所示
<Appenders>
...
<RabbitMQ name="rabbitmq"
bufferSize="10" ... >
<ArrayBlockingQueue/>
</RabbitMQ>
</Appenders>