EclipsePDE和log4j.properties?

EclipsePDE和log4j.properties?,eclipse,log4j,eclipse-pde,Eclipse,Log4j,Eclipse Pde,我创建了一个eclipse PDE项目,并使用slf4j api和slf4j.log4j12捆绑包添加了log4j作为依赖项。在一个类中,我创建了记录器: import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MyTest { private static final Logger logger = LoggerFactory.getLogger(MyTest.class .getName(

我创建了一个eclipse PDE项目,并使用slf4j api和slf4j.log4j12捆绑包添加了log4j作为依赖项。在一个类中,我创建了记录器:

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");

  }

}
但是,当我使用OSGI启动配置运行PDE项目时,会收到警告:

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

我需要将log4j.properties放在PDE类路径中。我尝试将其放在PDE项目的根目录中,并添加:

source.. = src/
output.. = bin/
bin.includes = META-INF/,\
               .,\
               log4j.properties
转到build.properties窗格。但我还是得到了同样的警告。在PDE项目中,我应该将log4j.properties文件放在哪里


编辑:我也尝试过将其添加到/src文件夹中,但没有任何帮助。

AFAIK,您仍然需要Log4j JAR,因为SLF4J只是它的包装器。从下载JAR,将其添加到构建路径,它应该可以正常工作

您遇到了OSGi的第一个资源可见性问题。请记住,在OSGi中,bundle必须明确定义它们的依赖项。您的问题是,您的bundle定义了一个log4j属性文件,但必须由log4j bundle读取它。但是log4j包对您的包一无所知(也不应该知道)

这里有两种解决方案:

  • 使用Eclipse的伙伴机制
  • 将log4j属性文件放在OSGi片段中,并将其托管在log4j包中

  • 选项2是一个更好的解决方案,但是如果你觉得选项1更容易,那么就这样做。

    我也遇到了同样的问题。将包含log4j.xml的文件夹添加到项目构建路径是不够的(为什么不?)。无论如何,除了这个原因(也许eclipse专家可以为我们解答这个问题)之外,我还解决了将包含log4j.xml的文件夹添加到eclipse“运行配置”中的问题

    首次尝试运行独立应用程序并收到恼人的“无法为记录器找到任何附加器”消息后,请按照以下步骤操作:

  • 转到菜单“运行”>“运行配置”
  • 主类应该出现在左树的某个地方。可能在“Java应用程序”下。所以选择它
  • 选择“类路径”选项卡,选择“用户条目”,然后单击“高级”按钮
  • 在“高级选项”弹出窗口中,选择“添加文件夹”,单击“确定”按钮
  • 在“文件夹选择”弹出窗口中,导航到log4j.xml所在的文件夹,然后单击“确定”按钮
  • 点击“运行”按钮。。。而且。。。终于
    当我试图从使用
    slf4j simple
    转换到
    slf4j-log4j12
    (添加
    log4j
    jar)时,我也遇到了同样的情况。在进行了一些调试之后,正如SteveD所提到的,这个问题是资源可见性的结果。在我的情况下,我有一个插件保存我的日志库;但是,我不想在共享插件中指定日志属性

    我的方法可能适合您的情况,就是为您希望具有日志功能的每个插件提供日志配置。对于需要日志记录的插件,我会在插件的activator中添加如下内容:

    Bundle bundle = bundleContext.getBundle();
    URL entry = bundle.getEntry("log4j.properties");
    
    try(InputStream inputStream = entry.openStream())
    {
        PropertyConfigurator.configure(inputStream);
    }
    catch(IOException e) {}
    
    尽管不幸的是,需要将代码添加到激活器中;我能够为每个插件配置不同的日志功能,我不必处理新插件/Eclipse好友注册,也不必管理任何manifest或build.properties文件中的log4j.properties文件

    其他注释

    • 当出现初始化失败消息(“请正确初始化log4j系统”)时,它只会出现一次。起初,当我没有检测到两(2)个插件配置不正确,但只显示一(1)条错误消息时,这让我有些困惑
      • 为什么不使用


        我最近在Eclipse插件中添加了日志记录。我使用了PDE中内置的日志记录功能。我将发布此消息,以防该选项被忽略。我没有意识到一开始我不需要添加log4j,也许其他人也没有意识到。

        loggin\u test是代码中类MyTest的包名吗?是的。我已将包更改为loggin.test,但它没有帮助。我也试过,但没能成功。欢迎提出任何建议!错误消息显示loggin_test.MyTest,这与loggin.test.MyTest不同,我知道,但那是在我更改为loggin.test.MyTest之前。更改后,我得到错误:log4j:WARN找不到记录器(loggin.test.MyTest)的appender。log4j:WARN请正确初始化log4j系统。将插件和log4j包中的清单粘贴到您的问题中。他一定已经有了JAR,否则log4j很难警告他它找不到任何appender…Jep我已经在清单文件中添加了org.apache.log4j版本1.2.13。我已经做了以下工作:1)创建了一个插件,我在其中添加org.apache.log4j作为依赖项。2) 使用以前的插件创建了一个片段作为主机,并将log4j.properties文件添加到根目录中。3) 创建了一个新插件,该插件依赖于1)中的插件。但是我不能使用以下命令实例化记录器:logger logger=logger.getLogger(“com.foo”);如何使log4j在最终的插件中可见,这取决于“包装”的log4j插件?当你说你不能使用Logger.getLogger时,你的意思是你遇到了编译时或运行时问题?1)中的插件只是log4j的包装版本吗?你是怎么创造的?您是否使用了Bundler或Bnd等工具?我不建议您自己包装知名的库——您可以在以下位置找到常见的开源库包:编译时错误。这是有意义的,因为log4j类型仅在插件中可见,直接依赖于log4j。我尝试了另一种方法:创建一个片段(使用.properties文件)并指定org.apache.log4j作为主机(我从网站下载了org.apache.log4j并手动将其添加到运行的目标平台)。但既然我不能依赖我另一半的碎片