2010-03-15 49 views
0

我需要傳遞一些值以啓用may應用中的某些代碼(在這種情況下,可以選擇在某些情況下啓用某些文件的寫入功能,但可能是任何通常)。在我的代碼中使用log4j傳遞設置標誌的一種方法

我的Java應用程序作爲服務安裝。所以我想到的每種方式都有一些缺點:

  1. 將另一個參數添加到main():因爲客戶已經安裝了該工具,並且每次都需要更改命令行,所以繁瑣。
  2. 將java -DmyEnvVar = A_VALUE添加到我的命令行中:與上面相同。
  3. 設置一個環境變量:至少應該重新啓動服務,即使此時您必須注意運行下的服務是什麼用戶等。
  4. 在配置文件中添加屬性:我不希望看到這種可見在配置文件,所以用戶不會看到它,這是調試等

所以我想也許有一些方法(或黑客)使用log4j記錄器將該值傳遞給我的代碼。我想到了已經一個標準,儘管是非常有限的:

  1. 添加一個虛擬類,我的代碼庫com.dummy.DevOptions

    公共類DevOptions { 公共靜態最後記錄器記錄= Logger.getLogger (DevOptions.class);

  2. 在我的代碼,這樣使用它:

    如果(DevOptions.logger.isInfoEnabled()){// 我做的東西可選} // ... 如果(DevOptions.logger .isDebugEnabled()){// 做其他的東西 }

這讓我使用不同的價值觀之間的區別,我可以通過增加更多的伐木者DevOptions增加的數量。但是我想知道是否有更簡潔的方法,可能只需在log4j.xml中配置記錄器?

回答

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即可,無需爲DevOption添加更多記錄器,只需要一個即可。

+0

如果「DevOptions.isEnabled(」value.A「)」是您唯一可以接受的語法(也許您已經編寫了一些其他支持代碼),那麼這聽起來沒問題。否則,我仍然會顯示靜態specialLogger :) – 2010-03-16 09:34:38

+0

平靜風暴,現在看我的回覆,你能明白我的意思嗎?當我在某些新代碼中需要另一個標誌時,無需繼續添加更多記錄器。現在只能使用一個記錄器,但所需的多個標記都可以使用。 – Persimmonium 2010-03-16 10:21:14

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添加類別提到這個字符串,如果你願意,你可以設置爲「加「是真/假(取決於您是否想將此日誌消息傳播給多個日誌記錄器)

PS:注意specialLogger是公共靜態的,並且可以使用100個類,例如它們是它們自己的記錄器。

+0

謝謝,但我知道這就是我所說的'爲DevOptions添加更多記錄器',添加更多不同名稱的記錄器。理想的情況是什麼,我在尋找一些方法做: 如果(specialLogger.isEnabled(「feature.A」)){// 做低層次的東西 } 並能夠在log4j的莫名其妙定置了feature.A .XML。 isEnabled(String)是這裏的關鍵。 – Persimmonium 2010-03-15 22:31:57

相關問題