<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Extreme Pattern: Log4j and OSGi</title>
    <link>http://blog.extremepattern.com/articles/2006/12/19/log4j-and-osgi</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>enjoy</description>
    <item>
      <title>Log4j and OSGi</title>
      <description>&lt;h3&gt;源起&lt;/h3&gt;


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


	&lt;h3&gt;參考&lt;/h3&gt;


	&lt;ol&gt;
	&lt;li&gt;&lt;a href="/articles/2006/12/18/config-ini-and-org-eclipse-osgi"&gt;config.ini and org.eclipse.osgi&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.eclipsezone.com/articles/franey-logging/"&gt;Universal Logger Plug-ins for &lt;span class="caps"&gt;RCP&lt;/span&gt; Applications&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://eclipsezone.com/articles/eclipse-vms/?source=archives" title="and many classloaders"&gt;Eclipse &amp;#8211; a tale of two VMs&lt;/a&gt;&lt;/li&gt;
	&lt;/ol&gt;


	&lt;h3&gt;Apache Commons Logging 設定&lt;/h3&gt;


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


	&lt;p&gt;可以在 equinox_install/configuration/config.ini 中設定 system properties 如下
，讓 commons logging 導向使用 log4j。&lt;/p&gt;


&lt;pre&gt;
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
&lt;/pre&gt;

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


&lt;pre&gt;
Import-Package: org.apache.log4j;resolution:=optional
&lt;/pre&gt;

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


	&lt;h3&gt;Apache Log4j 設定&lt;/h3&gt;


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


&lt;pre&gt;
log4j.configuration=file:/C:/equinox_install/configuration/log4j.properties
&lt;/pre&gt;

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


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

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


	&lt;h3&gt;基本動作&lt;/h3&gt;


	&lt;p&gt;每個有日誌需求的客端 bundle 必須在其 &lt;span class="caps"&gt;MANIFEST&lt;/span&gt;.MF 上有下列標示 :&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;Import-Package: org.apache.commons.logging&lt;/li&gt;
		&lt;li&gt;Requires-Bundle: org.apache.log4j&lt;/li&gt;
		&lt;li&gt;Eclipse-RegisterBuddy: org.apache.log4j&lt;/li&gt;
	&lt;/ol&gt;


	&lt;h3&gt;觀察&lt;/h3&gt;


	&lt;ol&gt;
	&lt;li&gt;每個需要日誌的 bundle 都要加上三個標示，要找看看有沒有比較簡化做法 ?&lt;/li&gt;
	&lt;/ol&gt;</description>
      <pubDate>Tue, 19 Dec 2006 22:54:00 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:7f5bf5d2-8413-491f-9548-abac875ea8d7</guid>
      <author>LIN</author>
      <link>http://blog.extremepattern.com/articles/2006/12/19/log4j-and-osgi</link>
      <category>java</category>
    </item>
  </channel>
</rss>
