gpt4 book ai didi

java - JUL 配置类应该如何(以及为什么)初始化?

转载 作者:行者123 更新时间:2023-11-30 07:14:08 26 4
gpt4 key购买 nike

我有一个命令行工具( frontend.java ),使用 args4j 选项类( Options.java )和 JUL 配置类( LogConfig.java )。因为在我的实际应用程序中,我需要查看并使用所选选项来配置日志记录,所以我在 frontend 中有一个静态 getter返回用户选择的各种 args4j 选项。

frontend.java:
import java.util.logging.Logger;

public class frontend{
private static Logger log = Logger.getLogger(frontend.class.getName());
private static Options opts = new Options();

public frontend(){
System.out.println("Made a new front end");
}
public static Options getOptions(){
if(opts == null)
System.out.println("Opts was null");
else
System.out.println("Opts is not null");
return opts;

}
public static void main(String[] args) {
frontend fe = new frontend();
}
}

显然,下一个文件并不是真正的空白,但我不确定这里是否需要任何内容​​来显示我的问题是什么。

Options.java:
public class Options{
}

最后是配置类:

LogConfig.java:
import java.util.logging.LogManager;
import java.util.logging.Logger;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class LogConfig {
public LogConfig() {
Options opts = frontend.getOptions();
try {
LogManager.getLogManager().readConfiguration(new FileInputStream("logging.properties"));
}catch (SecurityException e) {
System.err.println("Problem accessing log config file: "
+ e.getMessage());
} catch (IOException e) {
System.err.println("Problem loading log config file: "
+ e.getMessage());
}
}
}

我的问题是 LogConfig类似乎掌握了 opts在静态初始化设置变量之前:

Output:
c:\>java -cp . frontend
Made a new front end
Opts is not null

c:\>java -Djava.util.logging.config.class=LogConfig -cp . frontend
Opts was null
Made a new front end
Opts is not null

c:\>

当您的主类必须在某种程度上处于 Activity 状态才能知道您的配置类需要完成什么任务时,使用 JUL 日志配置类的最佳方法是什么?

最佳答案

创建 Logger 会触发 LogManager 启动。延迟创建记录器,直到需要使用它为止。

public class frontend {

private static volatile Logger log;
private static Options opts = new Options();

public frontend() {
System.out.println("Made a new front end");
}

public static Options getOptions() {
if (opts == null) {
System.out.println("Opts was null");
} else {
System.out.println("Opts is not null");
}
return opts;

}

public static void main(String[] args) {
frontend fe = new frontend();
log = Logger.getLogger(frontend.class.getName());
}
}

否则,您可以在 LogManager 启动完成后自行重新创建配置类。然后让您的 LogConfig 在 getOptions 返回 null 时执行无操作。

public class frontend {

private static final Logger log = Logger.getLogger(frontend.class.getName());
private static Options opts = new Options();

public frontend() {
System.out.println("Made a new front end");
}

public static Options getOptions() {
if (opts == null) {
System.out.println("Opts was null");
} else {
System.out.println("Opts is not null");
}
return opts;

}

public static void main(String[] args) {
frontend fe = new frontend();
init();
}

private static void init() {
String n = System.getProperty("java.util.logging.config.class");
if (n != null) {
try { //LogManager uses the system class loader.
Class<?> k = Class.forName(n, false,
ClassLoader.getSystemClassLoader());
k.newInstance();
} catch (ReflectiveOperationException | LinkageError ignore) {
ignore.printStackTrace();
}
}
}
}

关于java - JUL 配置类应该如何(以及为什么)初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38708141/

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