簡體   English   中英

如何銷毀Log4j記錄器實例

[英]How to destroy log4j logger instances

我有一個可同時運行的代碼,每次運行都需要在文件中記錄一些內容。 每次執行-具有唯一文件的新故事。

因此,我不能只是獲取記錄器的類名,添加文件附加器,寫入日志,關閉和刪除附加器,因為運行並發代碼時-記錄器將包含兩個附加器,並且日志將被寫入這兩個文件。

因此,我可以為每個執行Logger.getLogger(classname + counter)創建一個新的記錄器實例,但是如何在工作完成后將其標記為垃圾?

附言:此外,我需要從所有這些記錄器中打印一些thimes來進行控制台。

也許我做錯了什么,也許沒有為此模式創建log4j,但我必須實現它。 但是log4j-優先級對我來說是選擇,因為它已在此大型應用程序中廣泛使用。

預先感謝您,安德烈!

您無法銷毀/清理Appender實例。 但是您可以使用Log4j2工具箱改進解決方案。

可以將事件路由到Log4j中的動態文件,但是大多數情況下,文件中的Marker已足夠,或者至少是更復雜路由的起點。

請仔細閱讀其文檔 特別是最后一段對您的情況很重要:

使用標記時必須考慮一些重要的規則。

  1. 標記必須唯一。 它們是通過名稱永久注冊的,因此請小心以確保應用程序中使用的標記與應用程序依賴項中的標記不同,除非這是所需要的。
  2. 父標記可以動態添加或刪除。 但是,這樣做相當昂貴。 相反,建議如上例所示,在首次獲得標記時識別父母。 具體而言,set方法在一次操作中替換了所有標記,而一次只能對一個標記進行添加和刪除操作。
  3. 評估具有多個祖先的標記比沒有父母的標記要昂貴得多。 例如,在一組評估標記是否與其祖父母相匹配的測試中,其花費是評估標記本身的3倍。 即使這樣,與解析呼叫者的類名或線路號相比,評估標記還是便宜的。

然后,您可以在配置中使用期望標記的地方使用標記,例如: $${marker:} 我還沒有在文件名中使用它,並且懷疑它是否有效,但是您可以基於Marker 創建路由

我使用了這個簡單的測試腳本,請注意使用為掃描器中的每一行創建的Marker 在您的情況下,它將由config或從Servlet輸入或類似的對象創建。

package toTest;

import java.util.Scanner;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;

public class TestMe {
    private final Logger myOneAndOnlyLogger = LogManager.getLogger("MyCentralName");
    public static void main(String[] args) {
        new TestMe().doMyThing();
    }

    private void doMyThing() {
        Scanner input = new Scanner(System.in);
        String line = "";
        while(!line.equals("QUIT")) {
            System.out.println("Line: ");
            line = input.nextLine();
            Marker forThisRound = MarkerManager.getMarker(line);
            myOneAndOnlyLogger.log(Level.ERROR, forThisRound, "1");
            myOneAndOnlyLogger.log(Level.ERROR, forThisRound, "2");
            System.out.println("Line done.");
        }
    }
}

和這個log4j2.properties (我手頭上有一個滾動文件的示例,在模式中有標記):

status = error
name = MarkerExample

#Make sure to change log file path as per your need
property.filename = /tmp/java/marker.log

filters = threshold

filter.threshold.type = ThresholdFilter
filter.threshold.level = debug

appenders = rolling

appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = /tmp/java/debug-backup-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} $${marker:} %-5p %c{1}:%L - %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=10MBONE
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 20

loggers = rolling

#Make sure to change the package structure as per your application

logger.rolling.name = MyCentralName
logger.rolling.level = debug
logger.rolling.additivity = false
logger.rolling.appenderRef.rolling.ref = RollingFile

暫無
暫無

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

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