6

Java 日志记录配置文件让我定义命名记录器的属性,例如

name.heikoseeberger.heikotron.level = FINE
name.heikoseeberger.heikotron.handlers = java.util.logging.FileHandler

到目前为止,一切都很好。现在我想配置那个特定的 FileHandler,例如使用一个特定的输出文件。不幸的是,我只知道如何配置“全局” FileHandler,它已经存在于配置文件中:

java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

我不想配置这个,而是与我的自定义Logger关联的实例。我已经尝试了以下方法,但没有成功:

name.heikoseeberger.heikotron.java.util.logging.FileHandler.pattern = %h/heikotron.log
name.heikoseeberger.heikotron.java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

是否可以设置特定FileHandler实例的属性?如果是,应该如何识别/命名这些?

4

3 回答 3

1

这是通过使用LogMangerconfig的顶级类文档中描述的选项来完成的。使用公共构造函数创建一个公共命名类,并调用配置处理程序所需的所有 java 调用。然后在您的日志记录属性中指示 LogManager 加载您创建的类以配置您的处理程序。否则,您可以将文件处理程序子类化,这将创建一个自定义命名空间来配置。

于 2013-08-01T15:51:38.377 回答
0

我认为不可能。如果您查看源代码,FileHandler您很快就会确定它使用字符串"java.util.logging.FileHandler.pattern" 来确定用于记录目的的文件模式

private void configure() {
        LogManager manager = LogManager.getLogManager();

        String cname = getClass().getName();

        pattern = manager.getStringProperty(cname + ".pattern", "%h/java%u.log");
        limit = manager.getIntProperty(cname + ".limit", 0);
        //...
    }

因此,处理程序甚至不会考虑您放入文件中的配置。

在我看来,处理程序不知道任何特定记录器(即name.heikoseeberger.heikotron)的存在,他们只知道如何发布给定的 LogRecord。

据我所见,特定记录器的处理程序是LogManager通过反射调用其默认构造函数来创建的,因此,当创建给定处理程序时,它不知道已请求哪个特定记录器,即这就是为什么它们的所有属性都是通过它们自己的类名而不是通过记录器的名称设置的。

于 2012-05-11T04:37:14.090 回答
0

如果我理解正确,您正在尝试使用 package.json 写入不同的日志文件java.util.logging。这不能在不扩展的情况下开箱即用。

如果您无法切换到另一个日志框架,例如Logback,请查看 java util logging.properties 的答案 :如何登录到两个不同的文件,看看它是否符合您的需求。

于 2012-05-28T10:42:14.870 回答