【问题标题】:slf4j/log4j: disabling console output when console is inappropriateslf4j/log4j:当控制台不合适时禁用控制台输出
【发布时间】:2011-04-19 15:27:45
【问题描述】:

我正在使用 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 中的主类认为使用控制台进行日志记录不合适,它不会尝试这样做? (例如,它禁用基于控制台的附加程序)我宁愿不必维护单独的 log4j.configuration 文件,但如果需要,我会这样做。

例如在我的主要课程中

static {
   if (shouldntUseConsole())
   {
      ?????
   }
}

我可以弄清楚如何实现shouldntUseConsole(),但我不知道为????? 放什么。

【问题讨论】:

    标签: java console log4j slf4j


    【解决方案1】:

    首先,slf4j 是一个 API,背后有一个实现,这里是 log4j,所以它是你需要配置的实现,而不是 slf4j。

    拥有不同日志记录行为的常用方法是使用不同的配置文件。对于 log4j,您可以为 A 和 B 设置不同的文件集,使用两个不同的 log4j.properties 文件,或者您可以让一个配置将“log4j.configuration”系统属性设置为另一个配置文件的名称。

    有关详细信息,请参阅http://logging.apache.org/log4j/1.2/manual.html 中的“默认初始化过程”部分。

    【讨论】:

      【解决方案2】:

      您可以将两个 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-09
        • 1970-01-01
        • 2020-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多