需要使用文件处理程序将“警告级别”日志写入不同的文件,但当.level = INFO时,控制台处理程序仍显示“ INFO”和“ SEVERE”,但没有警告

时间:2019-01-22 20:58:51

标签: websphere-8 java.util.logging

我们在Websphere上有一个Java应用程序,我们只需要SystemOut.log打印日志级别SEVERE和INFO(使用现有的java.util.logging默认的ConsoleHandler),但是我们需要使用FileHandler将警告写入单独的文件中。

创建了一个LevelBasedFileHandler,它需要写入日志级别和文件,我可以看到日志文件已根据需要进行了更新。

但是警告级别也写在SystemOut.log中,需要一种阻止它们出现的方法

logger.addHandler(new LevelBasedFileHandler("../logs/warning.log", Level.WARNING));


logger.setFilter(new LevelBasedFilter()); - Trying to see if i can filter

logger.setUseParentHandlers(false);
如果我删除它,则使用logger.setUseParentHandlers(false)不会将任何信息打印到SystemOut.log,我也看到警告信息。任何想法我都可以从中过滤警告级别吗?

1 个答案:

答案 0 :(得分:0)

如果在记录器级别进行过滤,这将在日志记录到达任何处理程序之前取消显示它们。您应该做的是在现有处理程序上安装过滤器。

例如,创建一个使用布尔值的过滤器:

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

public class WarningFilter implements Filter {

   private final boolean complement;

    public WarningFilter(final boolean complement) {
        this.complement = complement;
    }

    @Override
    public boolean isLoggable(LogRecord r) {
        return Level.WARNING.equals(r.getLevel()) != complement;
    }
}

接下来,您应该在每个处理程序上安装过滤器。例如:

    private static final Logger logger = Logger.getLogger("some.other.logger.name");
    public static void main(String[] args) throws Exception {
        boolean found = false;
        for (Handler h : Logger.getLogger("").getHandlers()) {
            h.setFilter(new WarningFilter(h instanceof ConsoleHandler));
        }

        if(!found) {
            Handler h = new ConsoleHandler();
            h.setFilter(new WarningFilter(true));
        }

        Handler h = new FileHandler();
        h.setFilter(new WarningFilter(false));
        logger.addHandler(h);

    }