我正在使用 ProcessBuilder 以编程方式启动 JVM .为清楚起见,我们将使用 ProcessBuilder 的 JVM 称为 JVM A,将其启动的 JVM B 称为 JVM B。JVM B 使用 slf4j/log4j 进行日志记录。
这里的问题是我在 JVM B 中执行的类是我有时在调试器中运行的类,在调试器中有控制台输出会很有帮助。
但是,如果我使用 ProcessBuilder 运行 JVM B,那么我不想要控制台输出,因为这需要 JVM A 读取进程的输出或 JVM B 挂起。
有没有办法从 JVM B 中控制 slf4j 或 log4j,这样如果我在 JVM 中的主类认为使用控制台进行日志记录是不合适的,它就不会尝试这样做? (例如,它禁用基于控制台的附加程序)我宁愿不必维护单独的 log4j.configuration 文件,尽管如果需要我会这样做。
例如在我的主课上
static {
if (shouldntUseConsole())
{
?????
}
}
我知道如何实现 shouldntUseConsole()
,但我不知道要为 ?????
添加什么。
最佳答案
首先,slf4j是一个API,背后有一个实现,这里是log4j所以是你需要配置的实现,而不是slf4j。
拥有不同日志记录行为的通常方法是拥有不同的配置文件。对于 log4j,您可以为 A 和 B 使用不同的文件集,使用两个不同的 log4j.properties 文件,或者您可以让一个配置将“log4j.configuration”系统属性设置为另一个配置文件的名称。
参见 http://logging.apache.org/log4j/1.2/manual.html 中的“默认初始化过程”部分了解详情。
关于java - slf4j/log4j : disabling console output when console is inappropriate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5718845/