Log4j and OSGi
Dec
源起
日誌的使用算是部署時候的必須考量,而且往往牽涉到所有參與的 bundle, 這裡以 Apache Commons Loggings 與 Apache Log4j 來練習,基本考量是 希望設定檔不要放在 classpath 去,因為這樣不能改。
參考
- config.ini and org.eclipse.osgi
- Universal Logger Plug-ins for RCP Applications
- 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 上有下列標示 :
- Import-Package: org.apache.commons.logging
- Requires-Bundle: org.apache.log4j
- Eclipse-RegisterBuddy: org.apache.log4j
觀察
- 每個需要日誌的 bundle 都要加上三個標示,要找看看有沒有比較簡化做法 ?