Разработка плагина Eclipse: регистрация ошибок в log4j для просмотра ошибок

Я пытаюсь сделать так, чтобы мой журнал из log4j переходил в представление Eclipse Журнал ошибок в моем плагине.

У меня есть два внешних пакета:

  • Пакет 1: создал проект разработки плагинов на основе существующих JAR-файлов, содержащих библиотеку log4j.
  • Пакет 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

А вот так выглядит моя виртуальная консоль:

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 и устанавливаю плагин через систему «установки программного обеспечения», он больше не работает ... ничего нигде не появляется. Я не могу заставить его работать, и я, честно говоря, не вижу, где я ошибаюсь.

Кто-нибудь может дать мне несколько советов? Спасибо.


Обновление Вот как теперь все выглядит:

Manifest.MF из комплекта "bundle.log4jProperties":

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

log4j.properties в комплекте "bundle.log4jProperties":

# 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

ErrorLogAppender.java в пакете "bundle.log4jProperties" (также в пакете "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, но не работает при развертывании на сайте обновлений и установке оттуда. Я думаю, это может быть связано с тем, что файл свойств не найден, но что мне нужно изменить, если я хочу, чтобы файл был найден??

Примечание: файл 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 действительно вращает плагин в операторе плагина.

Пожалуйста, кто угодно. Помощь. Это довольно фантастично, что я борюсь с чем-то, что сделано почти в каждом плагине, но мне нигде не удается найти решение. Итог: я хочу записывать ошибки в журнал ошибок. Это должно быть возможно, верно?


person testuser    schedule 21.10.2013    source источник
comment
Возможно, log4j.properties не найден? Есть несколько других вопросов SO по этому поводу - например, этот: работа в исполняемом банке"> stackoverflow.com/questions/11919126/   -  person greg-449    schedule 23.10.2013
comment
Я думаю, это, вероятно, это. Но ни один из этих других вопросов (я перепробовал все, что смог найти, включая тот, который вы связали) не дал мне решения. И почему это работает при запуске плагина из среды разработки Eclipse? Но не при развертывании и установке с сайта обновлений?   -  person testuser    schedule 29.10.2013
comment
Хорошо, так что: видимо, при сборке сайта обновлений не были включены связки slf4j и log4jProperties. Я изменил это. Теперь это все еще не работает, однако пакеты теперь присутствуют в установленных плагинах при чистой установке eclipse.   -  person testuser    schedule 30.10.2013
comment
После установки убедитесь, что ваши плагины активны. Возможно, вы захотите использовать для этого расширение org.eclipse.ui.startup.   -  person Basilevs    schedule 01.02.2015
comment
Думаю, при установке с сайта обновлений вы получите бинарную сборку плагина. Может быть, ваш отсутствующий файл свойств не добавлен в двоичный файл build.properties?   -  person gia    schedule 28.05.2015