一种在我的代码中使用log4j传递集标志的方法

时间:2010-03-15 16:21:01

标签: java log4j

我需要传递一些值来启用may app中的某些代码(在这种情况下,可选择在某些条件下将某些统计信息写入文件,但通常可能是这样)。

我的Java应用程序已作为服务安装。所以我想到的每一种方式都有一些缺点:

  1. 向main()添加另一个参数:由于客户已经安装了该工具,因此很麻烦,并且每次都需要更改命令行。
  2. 将java -DmyEnvVar = A_VALUE添加到我的命令行:与上面相同。
  3. 设置一个环境变量:至少应该重新启动服务,即使这样,你也必须注意在其他服务下运行的服务用户。
  4. 在配置文件中添加属性:我不希望在配置文件中显示该属性,因此用户看不到它,它是用于调试等的。
  5. 所以我想也许有一些方法(或黑客)使用log4j记录器将该值传递给我的代码。我已经想过一种方法,虽然非常有限:

    1. 在我的代码库com.dummy.DevOptions

      中添加一个虚拟类

      public class DevOptions { public static final Logger logger = Logger.getLogger(DevOptions.class);

    2. 在我的代码中,使用它如下:

      if(DevOptions.logger.isInfoEnabled()){   //做我的可选东西 } // ... if(DevOptions.logger.isDebugEnabled()){   //做其他的事 }

    3. 这允许我在各种值之间使用区别对象,我可以通过向DevOptions添加更多记录器来增加数量。但我想知道是否有更简洁的方法,可能只在log4j.xml中配置记录器?

2 个答案:

答案 0 :(得分:0)

在log4j中你根本不需要Java类来创建记录器(这可能会让人感到意外)。您只需要一个包限定字符串,而不是创建记录器类别的Java类。如果我是你,我会做以下

PS:代码无法保证编译/运行

public class SomeAppCode {
      public static final Logger specialLogger = Logger.getLogger("com.mypackage.mysubpackage.speciallogger");

      public void someMethod() {
        if(specialLogger.isDebugEnabled()) {
           //do low level stuff
        } 

      }
}

在你的log4j.xml中为这个提到的字符串添加一个类别,如果你想要你可以将“additivity”设置为true / false(取决于你是否要将此日志消息传播到多个loggerS)

PS:注意,specialLogger是公共静态的,可以被100多个类使用,就像它们自己的记录器一样。

答案 1 :(得分:0)

好吧我觉得我找到了我需要的东西,实际上并不那么难......

 public class DevOptions{
  public static boolean isEnabled(String myvalue){
    Logger logger = Logger.getLogger(myvalue);
    return logger.isDebugEnabled();
  }

}

public class SomeAppCode {
  public void someMethod() {
    if(DevOptions.isEnabled("value.A")) {
       //do low level stuff
    } 
  }

}

我可以在log4j.xml中添加尽可能多的值,例如value.A:

  <logger name="value.A" additivity="true"><level value="debug" /></logger>

这样我只需修改log4j.xml即可添加任意数量的值,无需向DevOptions添加更多记录器,只需要一个就足够了。