2013-02-18 48 views
4

在Logback中,我們可以配置爲:1當日志文件的大小達到50MB時,旋轉文件並對其進行壓縮。所以我想知道它會在一個單獨的線程中執行壓縮的東西,它會有任何性能問題?在Logback中壓縮日誌文件的單獨線程?

回答

5

我調查了logback-1.0.3。 讓我們考慮用例:

  1. 您在代碼中調用Logger#error(String)
  2. 您的數據filtered根據記錄器配置。
  3. 後會buildLoggingEventAndAppendcallApenders
  4. 在你的情況下調用Appenders將調用append方法在OutputStreamAppender
  5. 當事件觸發時,基於觸發的RollingFileAppender將調用rollover
  6. 在翻轉方法將調用appropriate compress method

正如你所看到的,所有東西都將被記錄並壓縮在與記錄數據相同的線程中。因此你不應該登錄時間關鍵的線程。我個人認爲,登錄同一個線程對於大多數應用程序來說並不重要,但它很大程度上取決於你的環境,性能要求,e.t.c。

如果要異步記錄數據,可以使用AsyncAppender。在這種情況下,壓縮也將在單獨的線程中。

+1

也許在同一個線程中調用compress方法的可能解決方案之一就是使用一個異步appender ... – 2013-02-18 11:23:52

+0

@AdamDyga你是對的。這是這個問題的法律解決方法。 – Taky 2013-02-18 11:45:34

+0

logback doc說異步appender使用固定大小的阻塞隊列,並且如果隊列開始填滿(壓縮大文件時可能會發生),則會在INFO級別和以下級別放置消息(您可以調整或禁用此選項)。如果隊列一直填滿,調用線程會阻​​塞,所以行爲會再次實現有效同步。您可能能夠調整隊列大小和文件大小以避免這種情況。 – 2015-09-03 18:05:21