5

项目设置:

  1. Logging-1.0.jar
    • 包含一个使用 slf4j/log4j 的 Logger.class
    • 依赖于 slf4j-api.jar、slf4j-log4j.jar、log4j.jar
  2. 日志记录OSGI-1.0.jar
    • 包装日志项目
    • 包含一个 Activator 和 MANIFEST.MF
    • lib/ 包含 logging-1.0.jar、slf4j-api.jar、slf4j-log4j.jar、log4j.jar
    • 来自 lib/ 的 jar 被添加到类路径中,来自 logging-1.0.jar 的包被导出
  3. SomeBundle-1.2.jar
    • 包含一个 Activator 和 MANIFEST.MF
    • 依赖于 LoggingOSGI-1.0.jar

从 SomeBundle 访问 Logger 类有效,但日志记录项目找不到 log4j.properties(log4j:WARN No appenders could be found for logger)。

问题:

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

2 回答 2

7

当我大约六年前最后一次尝试这个时,解决方案变成了使用log4j.properties文件创建一个片段包,然后将该片段(通过清单头)附加到加载日志库的包(“Logging -1.0.jar,”在你的情况下)。对于看似如此简单的目标,感觉需要大量的项目结构、构建时间和部署开销。Fragment-Host

有关片段包的更多详细信息,请参阅OSGi 服务平台核心规范的第 3.14 节。

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

如果我没有指出OSGi 服务平台服务纲要第 101 节中指定的 OSGi 日志服务,我也会失职。

于 2012-08-24T13:25:56.383 回答
1

为了解决我的问题,我将此代码添加到配置 log4j 的 LoggingOSGI-1.0 的激活器中。文件路径取自系统属性:-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);
    }
}
于 2012-08-24T13:29:35.813 回答