2010-08-26 7 views
3

Я создал проект Eclipse PDE и добавил log4j в качестве зависимости, используя пакеты slf4j-api и slf4j.log4j12. В классе я создал регистратор:Eclipse PDE и log4j.properties?

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class MyTest { 

    private static final Logger logger = LoggerFactory.getLogger(MyTest.class 
     .getName()); 

    public void tt() { 
    logger.info("log-test"); 

    } 

} 

но при запуске проекта PDE с использованием конфигурации запуска OSGI я получаю предупреждение:

log4j:WARN No appenders could be found for logger (loggin_test.MyTest). 
log4j:WARN Please initialize the log4j system properly. 

на основе этой информации:

http://jaikiran.wordpress.com/2006/07/05/i-get-log4jwarn-no-appenders-could-be-found-for-logger-message-2/

Мне нужно поставить log4j.properties в путь класса PDE. Я попытался поставить его в корень проекта PDE и добавить:

source.. = src/ 
output.. = bin/ 
bin.includes = META-INF/,\ 
       .,\ 
       log4j.properties 

к панели build.properties. Но я все равно получаю такое же предупреждение. Где я могу поместить файл log4j.properties в проект PDE?

EDIT: Я также попытался добавить его в папку/src, но это не поможет.

+0

Является ли loggin_test именем пакета для класса MyTest в вашем коде? – JoseK

+0

Да. Я изменил пакет на loggin.test, но это не помогает. Я также пробовал: http://sites.google.com/site/springosgi/ch02.html , но не смог заставить его работать. Любые предложения более чем приветствуются! – u123

+0

В сообщении об ошибке говорится: * loggin_test.MyTest *, который не совпадает с * loggin.test.MyTest * – JoseK

ответ

0

AFAIK, вам все еще нужен Log4j JAR, поскольку SLF4J - это всего лишь обертка вокруг него. Загрузите JAR с Apache web site, добавьте его в свой путь сборки, и он должен работать нормально.

+0

У него уже должен быть JAR, иначе log4j предупредит его, что он не может найти никаких добавок ... – SteveD

+0

Jep Я уже добавил файл манифеста org.apache.log4j версии 1.2.13. – u123

2

Вы столкнулись с первой проблемой видимости ресурсов с OSGi. Помните, что в пакетах OSGi они должны явно определять свои зависимости. Ваша проблема заключается в том, что ваш пакет определяет файл свойств log4j, но это пакет log4j, который должен его прочитать. Но пакет log4j ничего не знает о вашем пакете (и не должен).

Вот 2 решения проблемы:

  1. механизм дружище Использование Eclipse в
  2. Поместите файл log4j свойство во фрагменте OSGi и разместить его на log4j пачке

Вариант 2 представляет собой лучшее решение, но если вы найдете вариант 1 проще, то идите с этим.

+0

Я сделал следующее: 1) Создал плагин, где я добавляю org.apache.log4j в качестве зависимости. 2) Создал фрагмент с предыдущим плагином в качестве хоста и добавил файл log4j.properties в корневой каталог. 3) создал новый плагин, который зависит от плагина от 1). Но я не могу использовать экземпляр регистратора с: Logger logger = Logger.getLogger ("com.foo"); Как сделать log4j видимым в конечном плагине, который зависит от «завернутого» плагина log4j? – u123

+0

Когда вы говорите, что не можете использовать Logger.getLogger, вы имеете в виду, что у вас возникает проблема времени компиляции или времени выполнения? Является ли плагин из 1) просто завернутой версией log4j? Как вы его создали? Вы использовали такой инструмент, как Bundlor или Bnd?Я не рекомендую самостоятельно обертывать известные библиотеки - вы можете найти пакеты общих библиотек с открытым исходным кодом по адресу: http://www.springsource.com/repository/app/ – SteveD

+0

Ошибка времени компиляции. Имеет смысл, поскольку типы log4j будут видны только в плагине напрямую в зависимости от log4j. Я пробовал другой подход: я создаю фрагмент (с файлом .properties) и указываю org.apache.log4j как хост (где я загрузил org.apache.log4j с веб-сайта и вручную добавил его на рабочую целевую платформу) , Но поскольку я не могу зависеть от фрагмента в моем другом плагине, а log4j в целевой платформе не знает, что он был «расширен» с фрагментом, у меня такая же проблема. – u123

0

У меня такая же проблема. Добавление папки, содержащей log4j.xml в Project Build Path, недостаточно (почему бы и нет?). Во всяком случае, помимо причины этого (возможно, гуру eclipse могут ответить на это для нас), я решил проблему, добавив в eclipse «Run configuration» папку, содержащую log4j.xml.

После попытки запустить автономное приложение в первый раз и получить раздражающее «Нет appenders не может быть найдена в регистраторе» сообщение, выполните действия, описанные ниже:

  1. Перейдите в меню «Выполнить»> " Run Configurations "
  2. Ваш основной класс должен появиться где-то в левом дереве. Возможно, в разделе «Java Application». Поэтому выберите его
  3. Выберите вкладку «Классы», выберите «Пользовательские записи» и нажмите кнопку «Дополнительно».
  4. В раскрывающемся окне «Дополнительные параметры» выберите «Добавить папки», нажмите кнопку «ОК».
  5. В раскрывающемся списке «Выбор папки» перейдите в папку, в которой находится log4j.xml, и нажмите «ОК» btn.
  6. Нажмите кнопку «Запустить» ... и ... Наконец!
+1

Это действительно не правильный способ сделать это, см. Решение hbunny. Проект PDE/RCP должен работать без изменения настроек Run/VM/classpath. Другими словами, что делает поведение приложения Eclipse исключительно установленными плагинами. –

0

Я только что был такой же ситуация, когда я пытался перейти от использования slf4j-simple в slf4j-log4j12 (при добавлении log4j банки). После некоторой отладки, как отмечает SteveD, проблема связана с видимостью ресурсов. В моей ситуации у меня был плагин, в котором хранились мои журналы регистрации; однако я не хотел указывать свои свойства ведения журнала в общем подключаемом модуле.

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

Bundle bundle = bundleContext.getBundle(); 
URL entry = bundle.getEntry("log4j.properties"); 

try(InputStream inputStream = entry.openStream()) 
{ 
    PropertyConfigurator.configure(inputStream); 
} 
catch(IOException e) {} 

Несмотря на то, что жаль, что код должен быть добавлен активатор; Мне удалось настроить различные возможности ведения журнала для каждого плагина, мне не пришлось иметь дело с новыми регистрациями подключаемых модулей/Eclipse, а также не иметь дело с управлением файлами log4j.properties в любом файле манифеста или build.properties.

Другие примечания

  • Когда появится сообщение не удалось на инициализацию («Пожалуйста, инициализировать систему log4j правильно»), он будет появляться только один раз. Это дало мне некоторую путаницу вначале, когда я не обнаружил, что два (2) плагина были настроены неправильно, но появилось только одно (1) сообщение об ошибке.
0

Почему бы не использовать platform logging facility?

Недавно я добавил запись в мой плагин Eclipse. Я использовал средство ведения журнала, которое встроено в PDE. Я опубликую это на всякий случай, если бы этот вариант был каким-то образом упущен. Я не понимал, что сначала мне не нужно добавлять log4j, возможно, другие тоже этого не осознают.

Смежные вопросы