2008-10-21 75 views
21

我開始開發一個Eclipse插件(技術上,一個OSGi插件),我遇到的第一個問題之一是我似乎無法控制公共日誌輸出爲我通常會。登錄Eclipse/OSGi插件

我已經在插件依賴關係中包含了commons-logging軟件包,實際上,當我記錄某些內容(INFO或更高嚴重級別)時,它將記錄到控制檯。但是,我似乎無法登錄到任何較低級別(如DEBUG或TRACE)。

我已經指定了一個log4j.properties文件,並且它在類路徑上(對於運行時,就像commons-logging軟件包一樣),但是該屬性文件中的設置都不會對該行爲產生任何影響記錄儀。

這裏的log4j.properties文件:

# Log4j Logging levels, in order of decreasing importance are: 
# FATAL, ERROR, WARN, INFO, DEBUG, TRACE 
# 

# Root logger option 
log4j.rootLogger=ERROR,stdout 
#,LOGFILE 

# Direct log messages to stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %r (%l) %t%n - %m%n 

什麼我需要做的,這樣我可以實際控制的記錄器的輸出?

下面是一些樣本輸出信息,同時希望在該格式可與java.util.logging的默認一致,或者給別人提供其他提示:

Oct 21, 2008 11:01:23 PM com.stottlerhenke.sentinel.client.Activator start 
SEVERE: fatal_message 
Oct 21, 2008 11:01:23 PM com.stottlerhenke.sentinel.client.Activator start 
WARNING: warn_message 
Oct 21, 2008 11:01:23 PM com.stottlerhenke.sentinel.client.Activator start 
INFO: info_message 

更新:

我現在已嘗試過各種組合:

,我可以得到DEBUG,或更低,級消息到如果我手動從提示符下運行的OSGi(這是出現對於我正在開發的東西不切實際)。此外,我不能通過各種屬性文件影響任何其他類型的日誌記錄配置。我在這方面嘗試的一切似乎都被日食設置所覆蓋。

我也試過把上述庫的各種配置文件放在很多地方,包括作爲建議here附加到它們各自的庫的插件片段,仍然會發生相同的結果。

我實現了一個自定義的LogListener和跟蹤日誌消息的整個路徑(以及我知道怎麼回事,反正)用的System.out.println的和調試消息目前的權利,直到他們由我使用的任何基礎日誌API輸出,然後它們消失。

回答

23

3天后...

我發現這個問題!有我需要做的,第一關兩兩件事,有一個MANIFEST.MF文件的一個問題:

我曾在MANIFEST.MF以下一包:

Bundle-ClassPath: lib/jena.jar, 
., 
org.apache.log4j-1.2.12.jar, 
lib/google-collect-snapshot.jar 
Import-Package: com.acme.client.translation, 
com.acme.translation.interfaces, 
com.acme.shared.osgi, 
com.acme.utilities 

已經這樣:

Bundle-ClassPath: lib/jena.jar, 
., 
lib/google-collect-snapshot.jar 
Import-Package: com.acme.client.translation, 
com.acme.client.translation.interfaces, 
com.acme.shared.osgi, 
com.acme.utilities, 
org.apache.log4j 

的關鍵的區別是,log4j的是被用作包,當它應該已經被用作束。 (我在我的lib目錄中有一個log4j jar,當時我期望Log4j能夠「與OSGi一起工作」。)罐子確實是工作,排序。它顯然發現了一些eclipse級別的log4j配置,並且使用了它。由於它只是一個jar包(不是捆綁包),它沒有使用任何可以指定自定義日誌記錄配置的碎片,這導致我們必須發生的其他事情:

我需要設置一個bundle片段來指定日誌配置。 This linkVonC給了我這樣做的信息。這需要做很多事情,不幸的是,具有不正確MANIFEST.MF的包仍然具有在Bundle-ClassPath中指定的log4j jar,並且似乎覆蓋了Import-Package列表。

我終於弄清楚當我需要登錄另一個包時(我剛剛放棄了這一點,然後又回到在警告級別或更高級別使用日誌),發生了什麼事情。找到一個日誌配置! (然後我有三個bundle運行在同一個OSGi環境中,每個都有不同的log4j行爲 - 一個使用我的分段設置,另一個使用一些隨機的Eclipse日誌設置,最後是沒有任何日誌配置的新bundle。)這三個軟件包的詳細比較揭示了Manifest.MF文件的差異,現在他們都使用片段包。

我欠了巨大得益於很多Eclipse ZoneVonCEkkes作者,每個人都在#eclipse freenode上的幫助和耐心:)

+0

@rcreswick可以請你讓我知道哪裏有您將log4j.properties文件放入插件中 – VamsiKrishna 2012-08-01 10:37:57

18

這不是您的問題的實際答案,但您可能會在此set of articles by ekke中找到一些線索。

我想你已經讀「Using Log4J in Eclipse Equinox/OSGi」:

你在控制檯模式下啓動一個OSGi會話?

java -jar org.eclipse.osgi_3.3.0.v20070530.jar -console -noExit -clean 

這樣,你可以在純osgi環境下測試log4j並檢查它是否在那裏工作。

讓使用者知道,如果你找到一個解決方案(發佈爲答案),我會投上一票;)