簡體   English   中英

使用無垃圾Log4j在Webapp中進行參數化日志記錄

[英]Parameterized logging in a Webapp with garbage-free Log4j

收集的事實:

  1. log4j 2.6提供了無垃圾日志記錄,它不是每次都創建新字符串,而是重用threadlocal中保存的stringbuilder。

  2. 默認情況下,在webApps中禁用無垃圾模式的log4j,因為webApps重用線程,並且在線程中保存日志會導致stringBuilder在幾天內建立起來。

我在WebApp中使用log4j,並驗證ENABLE_THREADLOCALS字段為false。

當我以下列方式登錄時:

  1. log.info("log statement with parameter {}", someString);
  2. log.info(""log statement with concatenation " + someString");

我看到,即使在完全GC之后,第一個語句仍保留在堆內存中。 第二個陳述沒有的地方。

我瀏覽了log.info的代碼,發現第一個使用“ ParameterizedMessage ”,而第二個使用“ SimpleMessage ”。

ParametrizedMessage創建是使用ThreadLocal完成的,即使對於WebApp也是如此,它有一個注釋:

 "// storing JDK classes in ThreadLocals does not cause memory leaks in web apps, so this is okay"

我的問題是,上述評論是否正確,因為我在webApp中使用{}時遇到內存泄漏問題。

PS:重新啟動webApp時沒有問題。 一切都在重新啟動時清除。 但是當webApp連續運行數天並且threadLocals的大小不斷增加時,這是一個問題。

你似乎遇到了一個錯誤: https//issues.apache.org/jira/browse/LOG4J2-1417

org.apache.logging.log4j.util.Unbox類在靜態ThreadLocal字段中存儲非JDK類(Unbox $ State)。

這可能會導致在應用程序之間共享線程池的容器中發生內存泄漏。

嘗試使用2.6.2或更高版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM