通过在运行Java代码时传递属性来覆盖默认值的Java日志管理器。

3
有没有一种方法可以在启动应用程序时通过传递命令行属性来覆盖Java中的LogManager配置。 目前,我使用以下方式将这些属性传递给LogManager:
File fn = new File(filename);
URL url = fn.toURI().toURL();
LogManager.getLogManager().readConfiguration(url.openStream())

filename contains this

handlers = java.util.logging.ConsoleHandler

.level = CONFIG

java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = abc.common.util.LogFormatter

java.util.logging.FileHandler.level = ALL
java.util.logging.FileHandler.formatter = abc.common.util.LogFormatter

我无法更改文件,但需要将.level = CONFIG更改为其他值。我无法更改代码,但只能在启动应用程序时传递Java属性。

是否有可能实现?

2个回答

2
您可以使用“-”从命令行传递一个新的配置位置。
 java -Djava.util.logging.config.file=<filelocation>

不错的观点。然而,java.util.logging.config.file参数仅修改无参数LogManager.readConfiguration方法的行为。该示例使用的是LogManager.readConfiguration(InputStream)方法,该方法不会查找该系统属性。 - jmehrens
我正在检查代码,它调用了一个重置,所以你是对的,这不会起作用。真令人沮丧!你能创建一个自定义版本的类,并在类路径中先行吗? - farrellmr
同意。这开始听起来像我在其他地方读到的答案了。 :) - jmehrens

1
鉴于您的限制,唯一有用的命令行参数是 java.util.logging.manager 系统属性。然后,您需要修改类路径参数以包含自定义日志管理器并执行所需步骤。
或者,如果您的目标只是更改根记录器级别,您可以将 JConsole 附加到正在运行的应用程序,并使用它来覆盖当前设置。在 MBeans 选项卡中,转到 java.util.logging->Logging->Operations->setLoggerLevel。删除“p0”字段中的所有字符,并在大写字母中输入级别名称,或在“p1”字段中输入级别编号。单击 setLoggerLevel 以更新级别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接