代码之家  ›  专栏  ›  技术社区  ›  Persimmonium

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

  •  0
  • Persimmonium  · 技术社区  · 15 年前

    我需要传递一些值来启用May应用程序中的某些代码(在本例中,是为了在特定条件下选择地允许向文件写入一些统计信息,但通常情况下可能是任何内容)。

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

    1. 在main()中添加另一个参数:很麻烦,因为客户已经安装了该工具,并且每次都需要更改命令行。
    2. 将Java-DMyEnVaVa= AyValm添加到命令行中:与上面相同。
    3. 设置一个环境变量:服务至少应该重新启动,即使这样,您也必须注意服务运行在什么用户之下等等。
    4. 在配置文件中添加属性:我不希望在配置文件中看到这个属性,这样用户就看不到它,它是用于调试等的内容。

    所以我想也许有某种方法(或黑客)可以使用log4j记录器将该值传递给我的代码。我已经想到了一种方法,尽管非常有限:

    1. 向我的codebase com.dummy.devolutions添加一个虚拟类

      公共阶级权力下放{ public static final logger logger=logger.getlogger(devolutions.class);

    2. 在我的代码中,这样使用:

      if(devolutions.logger.isinfoEnabled()){ //做我的选择 } /… if(devolutions.logger.isDebugEnabled()){ //做其他事情 }

    这允许我在不同的值之间使用区分,并且我可以通过在devolutions中添加更多的记录器来增加数字。但我想知道是否有一种更干净的方法,可能只在log4j.xml中配置记录器??

    2 回复  |  直到 15 年前
        1
  •  0
  •   Kannan Ekanath    15 年前

    在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”(取决于是否要将此日志消息传播给多个记录器)

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

        2
  •  0
  •   Persimmonium    15 年前

    好吧,我想我找到了我需要的,其实不是那么困难吗…

     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就可以添加任意多的值,不需要向devolutions添加更多的记录器,只需添加一个就足够了。