簡體   English   中英

根據記錄器名稱登錄到其他文件

[英]Log to different files based on logger name

我有以下問題。 我正在開發一個對所有記錄器使用文件追加器的應用程序(log4j 1.2版)。 一切正常,但是現在我需要根據一些運行時參數登錄到其他文件。

作為限制,我還需要限制log4j.xml配置信息的數量,因為我事先不知道此參數將采用多少值,因此,我無法配置指向該參數的其他附加程序(FileAppenders) log4j配置文件中的其他文件。 我還需要限制添加的新代碼的數量,例如,可以將運行時參數作為記錄器名稱的一部分傳遞(LoggerFactory.getLogger(runtimeParameter + getClass)等),但是我不願意創建通過代碼創建一個新的FileAppender,然后將該新的Appender添加到最近創建的記錄器中(附帶的問題,這種替代方法可行嗎?)。

我認為也許可以創建一個新的附加程序,根據他提供的名稱(基於運行時參數)打開不同的文件,但是我不知道該怎么做,我也不知道它在執行時的行為同時(因為它將是所有記錄器的單個追加程序)。

謝謝您,請原諒我的英語!

聽起來,最簡單的解決方法是實時以編程方式配置和創建記錄器對象。

是的,它有效。 幸運的是,我剛剛解決了這個問題,並提供了示例代碼。 但是,這用於log4j2。 我相信它在1.2中會更容易和直接

/**
 * Dynamically creates an instance of a Logger.
 * 
 * @param appenderName
 *            most often will be the name of the class this logger will
 *            belong to.
 * @param logFileName
 *            the file name to save the logs to
 * @return
 */
public static org.apache.logging.log4j.Logger createInstanceLogger(String appenderName,
        String logFileName) {
    //call getLogger() which will create and load a logger with a default configuration
    org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager
            .getLogger(String.format("DynamicLogger%s",
                    String.valueOf(DynamicLogManager.loggerCount++)));
    org.apache.logging.log4j.core.Logger coreLogger = (org.apache.logging.log4j.core.Logger) logger; // cast logger to core logger to access protected methods
    org.apache.logging.log4j.core.LoggerContext context = coreLogger.getContext();
    org.apache.logging.log4j.core.config.BaseConfiguration configuration = (org.apache.logging.log4j.core.config.BaseConfiguration) context
            .getConfiguration();

    TriggeringPolicy compositePolicy = CompositeTriggeringPolicy.createPolicy(
            SizeBasedTriggeringPolicy.createPolicy("5mb"),
            TimeBasedTriggeringPolicy.createPolicy("1", "true"));

    String fileName = String.format("%1$s/%2$s", appenderName, logFileName);
    String filePattern = String.format("%1$s/%2$s.%%d{yyyy-MM-dd}",
            appenderName, logFileName);

    Layout<String> layout = PatternLayout.createLayout(DynamicLogManager._conversionPattern,
            configuration, RegexReplacement.createRegexReplacement("a^", "."), //empty regex replacement
            "utf-8", "false");

    Filter f = ThresholdFilter.createFilter("trace", "accept", "accept");

    Appender a = RollingFileAppender.createAppender(fileName, //fileName
            filePattern, //filePattern
            "true", //append
            appenderName, //appender name
            "true", //bufferred io
            "true", //immediate flush
            compositePolicy, //policy
            null, //strategy default
            layout, //layout
            f, //filter none
            "true", //ignore exceptions
            "false", //advertise
            "null", //advertise uri
            configuration //configuration
            );

    a.start();

    coreLogger.addAppender(a);

    //this is where we would figure out how to configure the logger to listen on a configuration file
    coreLogger.setLevel(Level.ALL); //set the log level of the logger that we are returning to Level.ALL

    return coreLogger; //cast logger back to Logger interface

暫無
暫無

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

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