Вход в плагины 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 протоколирования, который я использую, затем они исчезают.
Ответы
Ответ 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 и проверить, работает ли он там.
Знайте, если вы найдете решение (опубликуйте его как ответ), и я проголосую за него;)