gpt4 book ai didi

java - 使用 log4j 以编程方式登录到多个文件

转载 作者:行者123 更新时间:2023-12-01 09:47:35 24 4
gpt4 key购买 nike

我想以编程方式将日志写入单独的文件,

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();

}

}

我在这个类中初始化记录器和Appenders,

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 个差异文件,但所有消息都会记录到所有文件中。

提前致谢。

最佳答案

Log4j 记录器像树一样工作。当您获得像 LogManager.getLogger(MyClass.class) 这样的记录器并且 MyClass 位于 org.my.company 命名空间中时,log4j 将遍历配置并查找“org.my.company.MyClass”,然后查找“org.my.company”等等,直到找到一个。如果没有,它会使用 rootlogger。

所以你可以用附加器“点击”那棵树。例如,您希望“org.my.company.api”中的所有类都登录到一个特殊文件中:配置一个名为“org.my.company.api”的记录器,将该 fileappender 添加到其中并使用 *.class 获取记录器。

就你而言,情况有点不同。您将获得具有特定名称的记录器,该名称可能不在命名空间树中。因此,如果没有具有该特殊名称的记录器,则使用根记录器。因此,所有消息都会传播到任何地方。

因此,您要做的不仅是配置附加程序,还要配置具有这些特定名称的记录器 - 例如“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  |- ...

Try:

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
}

关于java - 使用 log4j 以编程方式登录到多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37859801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com