プラグインの Eclipseエラー ログビューに移動するために、log4j からログを作成しようとしています。
2 つの外部バンドルがあります。
- バンドル 1: log4j ライブラリを含む、既存の JAR に基づいてプラグイン開発プロジェクトを作成しました。
- バンドル 2: 空のプラグイン開発プロジェクトを作成しました。それに log4j.properties を追加し、「ConsoleAppender」を拡張する新しいクラス「VirtualConsole」を追加しました。
これは私のlog4j.propertiesがどのように見えるかです:
# Set root logger level to debug and its only appender to default.
log4j.rootLogger=debug, default
# default is set to be a ConsoleAppender.
log4j.appender.default=VirtualConsole
# default uses PatternLayout.
log4j.appender.default.layout=org.apache.log4j.PatternLayout
log4j.appender.default.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
そして、これは私のVirtualConsoleがどのように見えるかです:
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LoggingEvent;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ui.statushandlers.StatusManager;
public class VirtualConsole extends ConsoleAppender {
@Override
public void append(LoggingEvent event) {
int level = IStatus.INFO;
if (event.getLevel().equals(Level.ERROR))
level = IStatus.ERROR;
IStatus status = new Status(level, "myplugin",
event.getMessage().toString());
StatusManager.getManager().handle(status, StatusManager.LOG);
//and the normal logging
super.append(event);
}
}
これは機能します。最初のバンドルを依存関係として他のバンドルに含めました。「右クリック > として実行 > Eclipse アプリケーション」で Eclipse 内からプラグインを実行すると、プラグインを実行でき、(意図的に) 何かを実行すると、ログが表示されるようになりました。ログはエラー ログ ビューに表示されます。
プラグインをエクスポートし、Eclipse のクリーン インストールを実行し、「ソフトウェアのインストール」システムを介してプラグインをインストールするとすぐに、プラグインが機能しなくなります...どこにも何も表示されません。私はそれを機能させることができず、正直なところ、どこが間違っているのかわかりません。
誰でも私にいくつかの指針を与えることができますか?ありがとう。
更新だから、これはすべてが今どのように見えるかです:
バンドル「bundle.log4jProperties」の Manifest.MF:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Log4jProperties
Fragment-Host: bundle.slf4j
Bundle-SymbolicName: bundle.log4jProperties
Bundle-Version: 1.0.1
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Require-Bundle: org.eclipse.core.runtime;bundle-version="3.7.0",
bundle.slf4j
Eclipse-RegisterBuddy: bundle.slf4j
バンドル「bundle.log4jProperties」の log4j.properties ファイル:
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
log4j.logger.org.hibernate.type=ERROR
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=bundle.log4jProperties.ErrorLogAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
バンドル「bundle.log4jProperties」内の ErrorLogAppender.java (パッケージ「bundle.log4jProperties」内、src フォルダー内):
package bundle.log4jProperties;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.spi.ThrowableInformation;
import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
public class ErrorLogAppender extends AppenderSkeleton {
@Override
public void close() {}
@Override
public boolean requiresLayout() {
return false;
}
@Override
protected void append(LoggingEvent event) {
//get the platform log
ILog log = Platform.getLog(Platform.getBundle
("bundle.log4jProperties"));
//create an IStatus status
IStatus status = new Status(getLevel(event.getLevel()),
"myPlugin",
getCode(event),
getMessage(event),
getThrowable(event));
//log the status
log.log(status);
}
private int getLevel(Level level) {
int severity;
if (level.equals(Level.ALL) ||
level.equals(Level.ERROR) ||
level.equals(Level.FATAL))
severity = IStatus.ERROR;
else if (level.equals(Level.WARN))
severity = IStatus.WARNING;
else if (level.equals(Level.INFO))
severity = IStatus.INFO;
else severity = IStatus.INFO;
return severity;
}
private int getCode(LoggingEvent event) {
return (int) event.getTimeStamp();
}
private String getMessage(LoggingEvent event) {
return event.getMessage().toString();
}
private Throwable getThrowable(LoggingEvent event) {
ThrowableInformation info = event.getThrowableInformation();
if (info != null)
return info.getThrowable();
else return null;
}
}
3 つの jar ファイルを含むバンドル "bundle.slf4j" に進みます: Manifest.MF:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Slf4j
Bundle-SymbolicName: bundle.slf4j
Bundle-Version: 1.0.1
Bundle-ClassPath: slf4j-api-1.7.5.jar,
slf4j-log4j12-1.7.5.jar,
log4j-1.2.17.jar
Bundle-Vendor: apache
Export-Package: org.apache.log4j,
org.apache.log4j.chainsaw,
org.apache.log4j.config,
org.apache.log4j.helpers,
org.apache.log4j.jdbc,
org.apache.log4j.jmx,
org.apache.log4j.lf5,
org.apache.log4j.lf5.util,
org.apache.log4j.lf5.viewer,
org.apache.log4j.lf5.viewer.categoryexplorer,
org.apache.log4j.lf5.viewer.configure,
org.apache.log4j.net,
org.apache.log4j.nt,
org.apache.log4j.or,
org.apache.log4j.or.jms,
org.apache.log4j.or.sax,
org.apache.log4j.pattern,
org.apache.log4j.rewrite,
org.apache.log4j.spi,
org.apache.log4j.varia,
org.apache.log4j.xml,
org.slf4j,
org.slf4j.helpers,
org.slf4j.impl,
org.slf4j.spi
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Eclipse-BuddyPolicy: registered
Eclipse 内から Eclipse アプリケーションとして実行する場合はすべて動作しますが、更新サイトにデプロイしてそこからインストールする場合は動作しません。これは、プロパティ ファイルが見つからないことに関係している可能性があると思いますが、ファイルを見つけたい場合は何を変更する必要がありますか??
注: updatesite にエクスポートしている feature.xml には、これも含まれています (切り捨てられ、不要なものが省略されています)。
<requires>
<import plugin="bundle.slf4j" version="1.0.1" match="greaterOrEqual"/>
</requires>
<plugin
id="bundle.slf4j"
download-size="0"
install-size="0"
version="0.0.0"/>
<plugin
id="bundle.log4jProperties"
download-size="0"
install-size="0"
version="0.0.0"
fragment="true"
unpack="false"/>
bundle.log4jProperties を必要なプラグインに追加できませんでした。そのプラグインを解決できないという警告が表示されるためです。どういうわけか私はこれが私の問題に関連していると思いますが、一体どのようにして自分の feature.xml (バンドル「機能」内) を同じワークスペースにあり、機能している別のバンドルを「解決」することになっていますか? 同じ feature.xml が plugin-statement でプラグインを展開するため、特に奇妙です。
どうぞ、どなたか。ヘルプ。ほぼすべてのプラグインで行われていることで苦労しているのに、どこにも解決策を見つけることができないのは素晴らしいことです。結論: エラー ログ ビューにエラーを記録したいと考えています。それは可能ですよね?