2016-12-07 304 views
0

我有異步appender與bufferSize="512"log4j2:爲異步appender刷新記錄器緩衝區

在某些情況下,我需要強行刷新緩衝區。我怎樣才能做到這一點?

我不想關閉LogManager,所以LogManager.shutdown();不是一個選項。

請幫忙!

更新:這是我log4j2.xml部分:

<Kafka name="Kafka" topic="logs-gexd-default"> 
    <PatternLayout> 
     <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5p %C{1}:%L - %m%n</pattern> 
    </PatternLayout> 
    <Property name="bootstrap.servers">${kafkaAddress}</Property> 
</Kafka> 
<Async name="AsyncKafka" bufferSize="512" blocking="false"> 
    <AppenderRef ref="Kafka"/> 
</Async> 

我有異步的appender內卡夫卡的appender。不幸的是,卡夫卡appender沒有異步appender具有immediateFlush字段。

回答

0

This answer可能會解決你的問題......你只需要找到一個特定的appender而不是全部沖洗。雖然,在你的情況下,flush信息可能不是你想要的...

你也可以使用這種技術來編寫一個方法,它將寫入一個給定的消息,然後立即刷新,然後調用setImmediateFlush(false) 。

+0

我已更新我的問題。 –

+0

對於Async appender,請查看:https://logging.apache.org/log4j/2.x/manual/async.html。 「異步Appender已經增強,可以在批處理結束時刷新到磁盤(當隊列爲空時),這與配置」immediateFlush = true「的結果相同,也就是說,所有接收到的日誌事件總是在磁盤上可用」 。這不完全是你想要的,但我認爲你可以做得更好。至於卡夫卡,我不確定... – Igor

1

AsyncAppender使用的緩衝區沒有刷新的概念。該緩衝區中的事件尚未處理,因此無法刷新。事件從隊列中取出的速度取決於基礎的Appender。

您是否正在尋找方法丟棄目前隊列中的所有事件?如果是這樣,你可以詳細說明你的用例嗎?意見後(該應用程序將簡單地添加更多LOGEVENTS到隊列中,所以我不能看到丟棄排隊的事件將是有益的...)


更新:

我建議你重新配置,而不是阻止一些Appender同時保持其他人在運行。如果您設置了monitorInterval,則可以更改配置文件以刪除要停止的Appender。作爲重新配置過程的一部分,Log4j2將確保在Appender停止之前完全處理在Async Appender中排隊的日誌事件。

+0

我需要在某個時刻停止appender。當我做到這一點時,我發現記錄器無法發送最後一個緩衝區中的數據。所以我想在停止前沖洗它。 –

+0

你是怎麼阻止這個appender的?另外,爲什麼你需要停止appender,但不關閉LogManager? –

+0

Kafka和Async appender都有'.stop()'方法。 我不想關閉LogManager,因爲我有其他appender正在運行。我不想阻止他們。 –