我们在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,我也看到警告信息。任何想法我都可以从中过滤警告级别吗?
答案 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);
}