Подтвердить что ты не робот

Вход в плагины 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

Update:

Теперь я попробовал различные комбинации:

и я могу получить сообщения DEBUG или lower, level, если я запускаю OSGi вручную из подсказки (что нецелесообразно для того, что я разрабатываю). Кроме того, я не могу использовать какой-либо другой тип конфигурации регистрации через различные файлы свойств. Все, что я пытаюсь сделать в этом отношении, кажется, переопределяется настройкой затмения.

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

Я внедрил пользовательский LogListener и отслеживал весь путь сообщения журнала (так же как и я знаю, как это сделать) с сообщениями System.out.println и отладочными сообщениями до тех пор, пока они не будут выведены каким-либо базовый API протоколирования, который я использую, затем они исчезают.

4b9b3361

Ответ 1

Через 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 использовался как пакет, когда он должен был использоваться как пакет. (У меня был лог файл log4j в моем каталоге lib, когда я ожидал, что Log4j "будет работать" с OSGi.) Банка работает, сортируется. Очевидно, он нашел некоторую конфигурацию log4j на уровне затмения и использовал это. Поскольку это была просто банка (а не пакет), она не использовала никаких фрагментов, которые могли бы указывать настраиваемую конфигурацию ведения журнала, что приводит нас к другой вещи, которая должна произойти:

Мне нужно было установить фрагмент пакета, чтобы указать конфигурацию ведения журнала. Эта ссылка из VonC предоставила мне информацию для этого. К сожалению, в пакете с некорректным MANIFEST.MF все еще был бит log4j, указанный в Bundle-ClassPath, и это, похоже, переопределяет список Import-Package.

Наконец-то я понял, что происходит, когда мне нужно войти в другой комплект (я только что отказался от этого момента и вернулся к использованию журналов на уровне Warn и выше.) Этот новый пакет не смог найти конфигурацию регистрации! (таким образом, у меня было три пучка, работающие в той же среде OSGi, каждая из которых имеет разные правила log4j - один с использованием параметров моего фрагмента, другой с использованием некоторых случайных настроек ведения журнала Eclipse и, наконец, новый пакет, у которого не было никакой конфигурации ведения журнала). Подробные сравнения этих трех пучков показали разницу в файлах Manifest.MF, и теперь все они используют фрагмент.

Я очень благодарен авторам большей части Eclipse Zone, VonC, Ekkes, и все в #eclipse на freenode за их помощь и терпение:)

Ответ 2

Это не реальный ответ на ваш вопрос, но вы можете найти некоторые подсказки в этом наборе статей по ekke.

Я полагаю, вы уже прочитали " Использование Log4J в Eclipse Equinox/OSGi":

Запустил ли сеанс osgi в режиме консоли?

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

Таким образом, вы можете протестировать log4j в чистой среде osgi и проверить, работает ли он там.

Знайте, если вы найдете решение (опубликуйте его как ответ), и я проголосую за него;)