Eclipse插件开发:错误登录log4j到错误视图

时间:2013-10-21 12:57:57

标签: eclipse log4j eclipse-plugin eclipse-3.6

我正在尝试从log4j进行日志记录,以转到我的插件中的Eclipse 错误日志视图。

我有两个外部捆绑包:

  • Bundle 1:基于现有JAR创建了一个插件开发项目,其中包含log4j库。
  • Bundle 2:创建了一个空插件开发项目。添加了一个log4j.properties和一个新类“VirtualConsole”,它扩展了“ConsoleAppender”。

这就是我的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;
    }
}

包含“bundle.slf4j”包,其中包含3个jar文件: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会在插件语句中旋转插件。

拜托,任何人。救命。 非常棒的是,我正在努力完成几乎所有插件中所做的事情,但我无法在任何地方找到解决方案。底线:我想将错误记录到错误日志视图中。那是必要的,对吗?

0 个答案:

没有答案