我正在使用ProcessBuilder以编程方式启动JVM。为清楚起见,我们调用使用ProcessBuilder JVM A的JVM和它启动JVM B的JVM.JVM B使用slf4j / log4j进行日志记录。
这里的问题是我在JVM B中执行的类是我有时在调试器中运行的类,它有助于控制台输出。
但是,如果我使用ProcessBuilder运行JVM B,那么我不想要控制台输出,因为这需要JVM A来读取进程的输出或JVM B挂起。
有没有办法从JVM B中控制slf4j或log4j,这样如果我在JVM中的主类认为使用控制台进行日志记录是不合适的,那么它不会尝试这样做吗? (例如,它禁用基于控制台的appender)我宁愿不必维护单独的log4j.configuration文件,尽管我会这样做,如果我需要这样做。
e.g。在我的主要班级
static {
if (shouldntUseConsole())
{
?????
}
}
我可以弄清楚如何实施shouldntUseConsole()
,但我不知道要为?????
添加什么。
答案 0 :(得分:1)
首先,slf4j是一个API,后面有一个实现,这里是log4j所以它是你需要配置的实现,而不是slf4j。
具有不同日志记录行为的常用方法是使用不同的配置文件。对于log4j,您可以为A和B设置不同的文件集,使用两个不同的log4j.properties文件,也可以让一个配置将“log4j.configuration”系统属性设置为另一个配置文件的名称。
有关详细信息,请参阅http://logging.apache.org/log4j/1.2/manual.html中的“默认初始化过程”部分。
答案 1 :(得分:1)
您可以将两个log4j文件与属性配置器对象一起使用。您的代码看起来像这样:
import org.apache.log4j.PropertyConfigurator;
if(shouldntUseConsole())
{
PropertyConfigurator.configure("NotConsoleLog4J.props");
}
else
{
PropertyConfigurator.configure("ConsoleLog4J.props");
}
这是适当的javadoc: http://logging.apache.org/log4j/1.2/apidocs/index.html