簡體   English   中英

使用log4j以編程方式登錄到多個文件

[英]Programmatically log into multiple files using log4j

我想以編程方式在單獨的文件中寫入日志,

public class ProgLoggerMultipaleFiles {

    HashMap<LogCategory, Logger> myLogHashMap = new HashMap<LogCategory, Logger>();

    public ProgLoggerMultipaleFiles() {

        JLogger jlog = new JLogger();
        jlog.startFileLog("mylog");
        jlog.startFileLog("HC");
        jlog.startFileLog("MC");
        jlog.startFileLog("DC");

        myLogHashMap.put(LogCategory.mylog, Logger.getLogger("mylog"));
        myLogHashMap.put(LogCategory.HC, Logger.getLogger("HC"));
        myLogHashMap.put(LogCategory.MC, Logger.getLogger("MC"));
        myLogHashMap.put(LogCategory.DC, Logger.getLogger("DC"));

        String parameter = "Hello";

        log(LogCategory.mylog,Priority.DEBUG,"This is debug : " + parameter);
        log(LogCategory.mylog,Priority.INFO,"This is info : " + parameter);
        log(LogCategory.mylog,Priority.WARN,"This is warn : " + parameter);
        log(LogCategory.mylog,Priority.ERROR,"This is error : " + parameter);
        log(LogCategory.mylog,Priority.FATAL,"This is fatal : " + parameter);

        log(LogCategory.HC,Priority.FATAL,"HC");
        log(LogCategory.MC,Priority.FATAL,"MC");
        log(LogCategory.DC,Priority.FATAL,"DC");

    }

    public void log(LogCategory category,Priority priority,String msg){
        myLogHashMap.get(category).log(priority, msg);
    }

    public enum LogCategory{
        mylog,HC,MC,DC
    }

    public static void main(String[] args) {

        ProgLoggerMultipaleFiles plog = new ProgLoggerMultipaleFiles();

    }

}

我在此類中初始化記錄器和Appender,

public class JLogger {

    public JLogger() {
        startConsolLog();
    }

    public void startConsolLog(){
        ConsoleAppender console = new ConsoleAppender(); //create appender
          //configure the appender
        String PATTERN = "%d [%p|%c|%C{1}] %m%n";
        console.setLayout(new PatternLayout(PATTERN)); 
        console.setThreshold(Level.FATAL);
        console.activateOptions();

        //add appender to any Logger (here is root)
        Logger.getRootLogger().addAppender(console);
    }

    public void startFileLog(String fileName){
        FileAppender fa = new FileAppender();
        fa.setName(fileName);
        fa.setFile(fileName+".log");
        fa.setLayout(new PatternLayout("%d %-5p [%c{1}] %m%n"));
        fa.setThreshold(Level.DEBUG);
        fa.setAppend(true);
        fa.activateOptions();
        //add appender to any Logger (here is root)

        Logger.getRootLogger().setAdditivity(false);
        Logger.getRootLogger().addAppender(fa);
        //repeat with all other desired appenders
    }

}

當我運行此代碼時,將創建4個diff文件,但所有消息都將記錄到所有文件中。

提前致謝。

Log4j記錄器的工作原理像一棵樹。 當您獲得LogManager.getLogger(MyClass.class)類的Logger並且MyClass位於org.my.company命名空間中時,log4j將遍歷配置並查找“ org.my.company.MyClass”,然后查找“ org.my.company”,並直到找到一個為止。 如果不是,則使用rootlogger。

因此,您可以使用附加程序“點擊”該樹。 例如,您希望“ org.my.company.api”中的所有類都登錄到一個特殊文件中:配置一個名為“ org.my.company.api”的記錄器,將其添加到文件中,並使用* .class獲取記錄器。 。

您的情況有些不同。 您將獲得具有特定名稱的Logger,該名稱可能不在名稱空間樹中。 因此,如果沒有使用該特殊名稱的記錄器,則使用根記錄器。 因此,所有消息無處不在。

因此,您要做的不僅是配置附加程序,還要配置具有特定名稱的記錄器-例如“ mylog”,然后將相應的附加器僅添加到該記錄器中。

Your tree:
root ← Appender Console, mylog, HC, MC, ...

but you need actually:
root ← Appender Console
  |- mylog ← Appender for mylog.log
  |- MC    ← Appender for MC.log
  |- ...

嘗試:

public void startFileLog(String fileName){
        FileAppender fa = new FileAppender();
        fa.setName(fileName);
        fa.setFile(fileName+".log");
        fa.setLayout(new PatternLayout("%d %-5p [%c{1}] %m%n"));
        fa.setThreshold(Level.DEBUG);
        fa.setAppend(true);
        fa.activateOptions();
        //add appender to any Logger (here is NOT root)

        Logger.getLogger(fileName).setAdditivity(false); // messages will not go to root logger anymore!
        Logger.getLogger(fileName).addAppender(fa);
        //repeat with all other desired appenders
    }

暫無
暫無

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

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