slf4j / log4j:当控制台不合适时禁用控制台输出

时间:2011-04-19 15:27:46

标签: java console log4j slf4j

我正在使用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(),但我不知道要为?????添加什么。

2 个答案:

答案 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