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

标签 java logging 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();

    }

}

我在这个类中初始化记录器和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/

相关文章:

java - 无法在 Springboot "no single-String constructor/factory method"中使用 Jackson 反序列化自定义日期对象

java - 当字段的值取决于其先前值时,为什么 Volatile 不起作用

java - Java 抽象 2D 几何库

java - 运行 Apache.Spark - log4j :WARN Please initialize the log4j system properly

java - 未使用 log4j 配置

java - MyBatis 日志中 pretty-print 查询

mysql - 是否可以在 txt 文件中记录我过去一小时运行的 mysql 查询?

java - 从具有预设名称的文件进行配置

java - 如何分离Log4j配置?

java - SSS 在 org.apache.log4j.helpers.ISO8601DateFormat 中代表什么?