Log4j and OSGi

0

源起

日誌的使用算是部署時候的必須考量,而且往往牽涉到所有參與的 bundle, 這裡以 Apache Commons Loggings 與 Apache Log4j 來練習,基本考量是 希望設定檔不要放在 classpath 去,因為這樣不能改。

參考

  1. config.ini and org.eclipse.osgi
  2. Universal Logger Plug-ins for RCP Applications
  3. Eclipse – a tale of two VMs

Apache Commons Logging 設定

OSGi 環境下面有 LogService 可以輸出日誌,不過現有的支援軟體都不是為 OSGi 設計, 為了支援現有的軟體需求,還是採用 Apache Commons Logging 的方式。

可以在 equinox_install/configuration/config.ini 中設定 system properties 如下 ,讓 commons logging 導向使用 log4j。

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

不過上述設定會需要 Log4JLogger 動態載入,所以 org.apache.commons.logging 這個 bundle 中間要有下面宣告,這樣做法可以讓需要時再使用,不需要 log4j 的使用環境, 可以不用管它。

Import-Package: org.apache.log4j;resolution:=optional

不過目前包好的 bundle 似乎都沒有加入選擇性載入 log4j 的設定,所以需要自己建一個。

Apache Log4j 設定

log4j.configuration 這個值雖說可以在 equinox_install/configuration/config.ini 設定 如下。

log4j.configuration=file:/C:/equinox_install/configuration/log4j.properties

不過這樣需要絕對路徑,如果要相對載入,可以藉由第一個 bundle 的 start() 中載入 LogFactory 之前設定如下,將預設的位置放到 equinox_install/configuration/log4j.properties。

System.setProperty("log4j.configuration", 
  System.getProperty("osgi.configuration.area") + 
  "log4j.properties");
Log logger = LogFactory.getLog(getClass());

不過 log4j.appender.logfile.File 可以支援相對路徑,例如設定 log4j.appender.logfile.File = logs/haha.log 會寫入到 equinox_install/logs/haha.log 。

基本動作

每個有日誌需求的客端 bundle 必須在其 MANIFEST.MF 上有下列標示 :

  1. Import-Package: org.apache.commons.logging
  2. Requires-Bundle: org.apache.log4j
  3. Eclipse-RegisterBuddy: org.apache.log4j

觀察

  1. 每個需要日誌的 bundle 都要加上三個標示,要找看看有沒有比較簡化做法 ?

Comments

(leave url/email »)

   Preview comment