如何为OSGI Bundle(Eclipse-Plugin)提供log4j.properties?

时间:2012-08-24 11:39:03

标签: java eclipse-plugin log4j osgi slf4j

项目设置:

  1. 记录-1.0.jar
    • 包含一个使用slf4j / log4j
    • 的Logger.class
    • 取决于slf4j-api.jar,slf4j-log4j.jar,log4j.jar
  2. LoggingOSGI-1.0.jar
    • 包装日志项目
    • 包含Activator和MANIFEST.MF
    • lib /包含logging-1.0.jar,slf4j-api.jar,slf4j-log4j.jar,log4j.jar
    • 来自lib /的jars被添加到类路径中,来自logging-1.0.jar的包被导出
  3. SomeBundle-1.2.jar
    • 包含Activator和MANIFEST.MF
    • 依赖于LoggingOSGI-1.0.jar
  4. 从SomeBundle访问Logger类可以正常工作,但是日志记录项目找不到log4j.properties(log4j:WARN没有为记录器找到appender)。

    问题:

    • 我在哪里放置log4j.properties?
    • 我能尝试什么想法? (已经尝试过:不同的目录,Eclipse-Buddies,-Dlog4j.configuration作为VM参数)
    • 是一个扩展点,它告诉日志记录项目log4j.properties的位置,这是一个很好的解决方案吗?

2 个答案:

答案 0 :(得分:7)

六年前我上次尝试时,解决方案转而使用 log4j.properties 文件创建片段包,然后附加该片段(通过Fragment-Host清单标头)到加载日志库的软件包(在您的情况下为“Logging-1.0.jar”)。对于看似简单的目标,感觉就像很多项目结构,构建时间和部署开销一样。

有关片段包的详细信息,请参阅OSGi Service Platform Core Specification的第3.14节。

另一个想法是考虑使用配置管理服务来指定磁盘上的日志记录配置文件的路径。这将需要扩充您的日志库以查找配置(或者,更好的是, listen ),然后将该配置传递给日志记录实现。

我也不能指出 OSGi服务平台服务纲要第101节中指定的OSGi日志服务。

答案 1 :(得分:1)

为解决我的问题,我将此代码添加到配置log4j的LoggingOSGI-1.0的Activator中。文件路径取自System属性:-Dlog4j.configuration=path/to/log4j.properties

仍然对此解决方案的其他方法或意见感兴趣。

private static final String LOG4J_CONFIG_KEY = "log4j.configuration";

public void start(BundleContext bundleContext) throws Exception {
    Activator.context = bundleContext;

    if (System.getProperties().containsKey(LOG4J_CONFIG_KEY)) {
        String file = System.getProperties().getProperty(LOG4J_CONFIG_KEY);
        PropertyConfigurator.configure(file);
    }
}