2

我使用了来自 Maven 存储库的 log4j-1.2.17 包。我尝试在包中执行此代码(我的包调用 log4j-1.2.17 包)

    PropertyConfigurator.configure(props());
private static Properties props() {
    Properties props = new Properties();
    props.put("log4j.rootLogger", "INFO, R");
    props.put("log4j.appender.R",
            "org.apache.log4j.DailyRollingFileAppender");
    props.put("log4j.appender.R.File", "logs/IhtikaClient.log");
    props.put("log4j.appender.R.Append", "true");
    props.put("log4j.appender.R.Threshold", "INFO");
    props.put("log4j.appender.R.DatePattern", "'.'yyyy-MM-dd");
    props.put("log4j.appender.R.layout", "org.apache.log4j.PatternLayout");
    props.put("log4j.appender.R.layout.ConversionPattern",
            //"%d{HH:mm:ss,SSS} %c - %m%n");
            //"[%5p] %d{yyyy-MM-dd mm:ss} (%F:%M:%L)%n%m%n%n");
            "[%5p] %d{yyyy-MM-dd mm:ss} %c (%F:%M:%L)%n%m%n");
    return props;
}

但我有错误

log4j:ERROR A "org.apache.log4j.DailyRollingFileAppender" object is not assignable to a "org.apache.log4j.Appender" variable. log4j:ERROR The class "org.apache.log4j.Appender" was loaded by log4j:ERROR [org.apache.felix.framework.BundleWiringImpl@9da1dd] whereas object of type log4j:ERROR "org.apache.log4j.DailyRollingFileAppender" was loaded by [sun.misc.Launcher$AppClassLoader@4b222f]. log4j:ERROR Could not instantiate appender named "R". log4j:ERROR A "org.apache.log4j.DailyRollingFileAppender" object is not assignable to a "org.apache.log4j.Appender" variable. log4j:ERROR The class "org.apache.log4j.Appender" was loaded by log4j:ERROR [org.apache.felix.framework.BundleWiringImpl@9da1dd] whereas object of type log4j:ERROR "org.apache.log4j.DailyRollingFileAppender" was loaded by [sun.misc.Launcher$AppClassLoader@4b222f]. log4j:ERROR Could not instantiate appender named "R".

Bundles 已按顺序加载

.getBundleContext().installBundle("......../log4j-1.2.17.jar")
.getBundleContext().installBundle("......../I_MainForm-1.0-SNAPSHOT.jar")

如何修复此错误?请,对不起我的英语。最好的问候,亚瑟。

4

4 回答 4

7

基本上,不要使用org.osgi.framework.system.packagesor将你的类“泄漏”到框架中org.osgi.framework.system.packages.extra,除非你真的需要在你的代码中而不是修复一些其他问题。显然,这是 log4j 问题。

您可以通过设置系统属性来修复它:

-Dlog4j.ignoreTCL=true 
于 2012-09-26T10:05:33.690 回答
4

由于您的 Log4j 类似乎已由sun.misc类加载器加载,我认为某些东西正在从 OSGi 外部提供 log4j 类。有 Log4J 条目解释了它为什么不能加载 Log4J 类的事实意味着已经存在某些版本的 Log4J 。

您使用的是定制版的 Felix 吗?如果是这样,您是否可以找到带有org.osgi.framework.system.packages=...条目或org.osgi.framework.system.packages.extra=...条目的配置文件之类的东西?

如果您只是删除 Log4j 包会发生什么?那么它还能找到 Log4j 类吗?

问候, 弗兰克

于 2012-07-30T10:29:09.877 回答
0

在您自己的代码中设置 log4j 在 OSGi 中不是一个好主意。你应该看看 ops4j pax logging。它负责日志框架的设置,你可以简单地在你的包中使用 log4j api。参见:http ://team.ops4j.org/wiki/display/paxlogging/Pax+Logging

于 2012-07-30T22:09:30.803 回答
0

这对我有用:

mvn install -D log4j.ignoreTCL=true
于 2022-02-23T17:15:25.303 回答