如何使用java.util.logging将不同的日志条目写入两个不同的日志文件?

时间:2017-11-20 20:52:14

标签: java logging java.util.logging

是否可以使用java.util.logging将不同的信息写入两个不同的日志文件?我能够创建两个不同的日志文件,但它们都包含相同的条目。我不会将我的Logger创建为静态。我基本上拥有自己的日志记录类,并且我为两个不同的记录器实例化了两次,但同样,两个文件都写入了相同的信息。

3 个答案:

答案 0 :(得分:0)

将两个FileHandler添加到记录器中。

final Logger logger = Logger.getRootLogger();

FileHandler handler1 = new FileHandler("foo");
FileHandler handler2 = new FileHandler("bar");

logger.addHandler(handler1);
logger.addHandler(handler1);

另见LogManager

仅供参考:Logback有更好的配置选项。这就是大多数人使用的。

答案 1 :(得分:0)

尝试设置两个客户记录器后,尝试从根记录器中删除所有处理程序。

foreach (Apple apple in consumables.consumables)
{
    renderer.DrawApple(apple);
}

您的客户处理人员可能配置不当,一切都将转到您的根记录器。

答案 2 :(得分:0)

  

是否可以使用java.util.logging将不同的信息写入两个不同的日志文件?

是。如果要捕获有关兄弟姐妹的信息,则必须将处理程序附加到记录器树中的不同位置。示例logging.properties如下所示:

java.util.logging.FileHandler.pattern=some%u.log
my.app.feature1.handlers=java.util.logging.FileHandler
my.app.feature1.useParentHandlers=false
my.app.feature2.handlers=java.util.logging.FileHandler
my.app.feature2.useParentHandlers=false

如果您需要将日志除以levelfilter by some other custom property,则应使用LogManager config option。 根据文件:

  

属性“config”。此属性旨在允许运行任意配置代码。该属性定义了一个以空格或逗号分隔的类名列表。将为每个命名类创建一个新实例。每个类的默认构造函数可以执行任意代码来更新日志记录配置,例如设置记录器级别,添加处理程序,添加过滤器等。

示例类将是:

package com.app.config;

import java.util.logging.FileHandler;
import java.util.logging.Filter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public final class ErrorAndInfoHandlers {

    /**
     * Don't allow G.C. to remove our settings.
     */
    private static final Logger[] PIN = new Logger[]{
        Logger.getLogger("app.feature"),
        Logger.getLogger("app.system")
    };

    public ErrorAndInfoHandlers() throws Throwable {
        installSystem();
        installApp();
    }

    private void installSystem() throws Throwable {
        FileHandler h = new FileHandler();
        h.setLevel(Level.ALL);
        h.setFilter(new LessThanFilter(Level.INFO));
        Logger.getLogger("app.system").addHandler(h);
    }

    private void installApp() throws Throwable {
        FileHandler h = new FileHandler();
        h.setLevel(Level.INFO);
        Logger.getLogger("app.feature").addHandler(h);
    }

    private static class LessThanFilter implements Filter {

        private final Level upper;

        LessThanFilter(final Level upper) {
            this.upper = upper;
        }

        @Override
        public boolean isLoggable(LogRecord record) {
            return record.getLevel().intValue() < upper.intValue();
        }
    }
}