【问题标题】:Turn Off Apache Common Logging关闭 Apache 通用日志记录
【发布时间】:2010-11-29 00:51:29
【问题描述】:

我在我的独立应用程序中使用 Apache Common Logging 库。通过网络搜索后,我尝试使用关闭日志记录

package javaapplication1;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 *
 * @author yccheok
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");

        log.info("You do not want to see me");
    }

    private static final Log log = LogFactory.getLog(Main.class);
}

但是,我仍然可以看到正在打印的日志消息。我可以知道我错过了什么吗?

我可以通过输入关闭日志记录

# Sample ResourceBundle properties file
org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog

在 commons-logging.properties 中。

但是,在我的开发期间,我的 Netbeans 不知道从哪里获取 commons-logging.properties,有时我需要在开发期间关闭日志记录。

【问题讨论】:

    标签: java


    【解决方案1】:

    正如其他人指出的那样,这是因为您在设置属性之前创建了 Log 对象

    解决此问题的一种方法是在 Main 类的静态初始化程序块中设置属性 - 这将在第一次加载类时运行,在创建静态最终日志之前:

    public class Main {
    
       static {
          System.setProperty("org.apache.commons.logging.Log",
                             "org.apache.commons.logging.impl.NoOpLog");
       }
    
       // Rest of class as before
    }
    

    【讨论】:

    • 你知道如何在 JRuby 中禁用 org.apache.commons.logging.Log 吗?我正在使用:require 'java' java::lang.static { java::lang.System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog") } 但它什么也没做......
    【解决方案2】:

    正如其他人指出的那样,您的 log 实例是在设置系统属性之前实例化的,这还为时过早。

    尝试将-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog 传递给您的JVM,以确保它设置在正确的时间。

    【讨论】:

      【解决方案3】:

      一种不同的方法可能是 - 在开发过程中 - 使用 slf4j 项目来控制日志记录。

      使用 commonds 日志记录桥将 Apache COMmons 日志记录替换为 sljf4,然后使用合适的日志记录后端。例如。 slf4j 简单或 NOP 实现对您来说是合理的。这些只是您放入类路径中的几个 jar。

      http://www.slf4j.org/legacy.html#jcl-over-slf4j

      【讨论】:

        【解决方案4】:

        您的示例的问题是 Log 类是在设置属性之前实例化的。如果您在设置属性后创建 Log 实例,则示例可以正常工作。例如,如果你把它移到 main 方法中:

        package javaapplication1;
        
        import org.apache.commons.logging.Log;
        import org.apache.commons.logging.LogFactory;
        
        /**
         *
         * @author yccheok
         */
        public class Main {
        
            /**
             * @param args the command line arguments
             */
            public static void main(String[] args) {
                // TODO code application logic here
                System.setProperty("org.apache.commons.logging.Log",
                                   "org.apache.commons.logging.impl.NoOpLog");
                Log log = LogFactory.getLog(Main.class);
        
                log.info("You do not want to see me");
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 2012-11-13
          • 1970-01-01
          • 2012-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-26
          • 1970-01-01
          相关资源
          最近更新 更多