gpt4 book ai didi

除了级别限制之外的 Java JUL 日志记录传播

转载 作者:行者123 更新时间:2023-12-01 11:21:18 24 4
gpt4 key购买 nike

我正在尝试使用具有自定义配置的 JUL 记录器,以便特殊处理程序负责不同的日志记录级别。我希望将严重问题(例如连接到数据库或读取属性时失败)记录到本地文件中,警告应由我的自定义处理程序写入数据库,其他所有内容都应该是调试输出并应打印到控制台如果启用了调试。这是我的记录器属性:

logger.level = SEVERE
logger.handlers = java.util.logging.FileHandler

logger.warning.level = WARNING
logger.warning.handlers = controller.database.DatabaseHandler

logger.warning.severe.level = ALL
logger.warning.severe.handlers = java.util.logging.ConsoleHandler

java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.append = false
java.util.logging.FileHandler.pattern = %h/app.log

controller.database.DatabaseHandler.level = WARNING

java.util.logging.ConsoleHandler.filter = controller.properties.DebugFilter
java.util.logging.ConsoleHandler.level = ALL

到目前为止,数据库处理程序除了用于测试的系统输出外不执行任何操作:

@Override
public void publish(LogRecord arg0) {
System.out.println("DatabaseHandler here! - Level=" + arg0.getLevel() + " - From=" + arg0.getLoggerName());

}

最后这是我的测试代码:

LogManager.getLogManager().readConfiguration(new FileInputStream("logProps.properties"));
Logger logger = Logger.getLogger("logger.warning.severe");
logger.log(Level.FINE, "A fine message", new Object());
logger.log(Level.WARNING, "A warning message", new Object());
logger.log(Level.SEVERE, "A severe message", new Object());

我期望的是第一条消息被打印到控制台,传递给“logger.warning”,然后被丢弃,因为它低于日志记录级别。 “logger”中的第二条消息也是如此,因此打印到文件的唯一消息是第三条消息。但是控制台输出如下所示:

DatabaseHandler here! - Level=FINE - From=logger.warning.severe
03.07.2015 07:54:55 controller.LoggerTest main
FEIN: A fine message
03.07.2015 07:54:55 controller.LoggerTest main
WARNUNG: A warning message
DatabaseHandler here! - Level=WARNING - From=logger.warning.severe
03.07.2015 07:54:55 controller.LoggerTest main
SCHWERWIEGEND: A severe message
DatabaseHandler here! - Level=SEVERE - From=logger.warning.severe

此外,所有三条消息都会打印到文件中。我已经没有办法解释这种行为了,有人可以帮忙吗?

附注log4j 不是一个选项,否则我会使用它

问候,斯韦雷

最佳答案

What i would expect is that the first message gets printed out to the console, passsed to "logger.warning" and then discarded, as it's below the logging level.

来自Java Logging Overview :

By default a Logger will log any output messages to its parent's handlers, and so on recursively up the tree.

当日志记录沿树向上传输时,它们不会传递到 logger.log 。因此,当子记录器发布到parent handlers时,父记录器的级别没有影响。 .

I want severe problems (such as failures when connecting to database or reading the properties) logged into a local file, warnings should be written into the database by my custom handler, everything else is supposed to be a debugging output and should be printed to console if debugging is enabled.

首先应将 FileHandler 的级别设置为 SEVERE,将 DB 处理程序设置为 WARNING,将 ConsoleHandler 设置为 all。然后你必须安装自定义filter在 ConsoleHandler 和 DB 处理程序上阻止在其他地方处理的级别:

    public class LessThanLevelFilter implements Filter {

private final int lvl;

public LessThanLevelFilter() {
String p = getClass().getName();
String v = LogManager.getLogManager().getProperty(p + ".level");
if (v != null) {
lvl = Level.parse(v).intValue();
} else {
lvl = Level.WARNING.intValue();
}
}

public LessThanLevelFilter(Level l) {
lvl = l.intValue();
}

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

关于除了级别限制之外的 Java JUL 日志记录传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31199842/

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