使用认可目录中的 log4j2
Using log4j2 from endorsed dirs
我的示例代码就这么简单:
import org.apache.log4j.Logger;
public class Test {
public static void main(String args[]){
LOG.info("information log line");
}
private final static Logger LOG = Logger.getLogger(Test.class);
}
它编译并且运行在 log4j 2.11.0 中没问题。
对于使用 jacORB 的项目,我需要将 log4j jar 文件 log4j-core-2.11.0.jar
和 log4j-api-2.11.0.jar
放入通过 -Djava.endorsed.dirs=someDir
添加到应用程序的目录中。因此,当我将 log4j-jars 复制到子目录 edDir 和 运行 上面的示例中
java -Djava.endorsed.dirs=edDir -Dlog4j.configurationFile=log4j.xml Test
它以这个输出终止:
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.apache.log4j.Logger.getLogger(Logger.java:41)
at Test.<clinit>(Test.java:7)
Caused by: java.lang.NullPointerException
at org.apache.logging.log4j.util.LoaderUtil.getClassLoaders(LoaderUtil.java:115)
at org.apache.logging.log4j.util.ProviderUtil.<init>(ProviderUtil.java:66)
at org.apache.logging.log4j.util.ProviderUtil.lazyInit(ProviderUtil.java:146)
at org.apache.logging.log4j.util.ProviderUtil.hasProviders(ProviderUtil.java:130)
at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:89)
... 2 more
它曾经与 log4j 2.6 一起工作。升级到log4j 2.11.0后出现上述错误。
我是不是做错了什么?
我怎样才能使这项工作再次发挥作用?
顺便说一句,JRE 是 1.7。
你试过命令行参数吗
log4j.ignoreTCL=真
这个参数似乎是为了在所有 classloader 上寻找 class。
所以像
java-Djava.endorsed.dirs=edDir-Dlog4j.configurationFile=log4j.xml
-Dlog4j.ignoreTCL=真测试
刚刚使用上面的示例(log4j-core-2.11.0.jar 和 log4j-api-2.11.0.jar)在 eclipse 中构建了您的项目 - 您需要更改您的导入语句并将 Logger 更改为 LogManager:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
LOG.info("information log line");
}
// private static final ExtLogger logger = ExtLogger.create(MyService.class);
private final static Logger LOG = LogManager.getLogger(Test.class);
}
问题发生在 log4j 类 由 Bootstrap 类加载器加载时,当在认可目录 (-Djava.endorsed.dirs=...
) 中找到 log4j jar 文件时就会出现这种情况。 Log4j 没有正确处理(请参阅开头 post 中的堆栈跟踪)。
问题已在 log4j 2.11.1 中解决。
我的示例代码就这么简单:
import org.apache.log4j.Logger;
public class Test {
public static void main(String args[]){
LOG.info("information log line");
}
private final static Logger LOG = Logger.getLogger(Test.class);
}
它编译并且运行在 log4j 2.11.0 中没问题。
对于使用 jacORB 的项目,我需要将 log4j jar 文件 log4j-core-2.11.0.jar
和 log4j-api-2.11.0.jar
放入通过 -Djava.endorsed.dirs=someDir
添加到应用程序的目录中。因此,当我将 log4j-jars 复制到子目录 edDir 和 运行 上面的示例中
java -Djava.endorsed.dirs=edDir -Dlog4j.configurationFile=log4j.xml Test
它以这个输出终止:
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.apache.log4j.Logger.getLogger(Logger.java:41)
at Test.<clinit>(Test.java:7)
Caused by: java.lang.NullPointerException
at org.apache.logging.log4j.util.LoaderUtil.getClassLoaders(LoaderUtil.java:115)
at org.apache.logging.log4j.util.ProviderUtil.<init>(ProviderUtil.java:66)
at org.apache.logging.log4j.util.ProviderUtil.lazyInit(ProviderUtil.java:146)
at org.apache.logging.log4j.util.ProviderUtil.hasProviders(ProviderUtil.java:130)
at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:89)
... 2 more
它曾经与 log4j 2.6 一起工作。升级到log4j 2.11.0后出现上述错误。
我是不是做错了什么? 我怎样才能使这项工作再次发挥作用?
顺便说一句,JRE 是 1.7。
你试过命令行参数吗 log4j.ignoreTCL=真
这个参数似乎是为了在所有 classloader 上寻找 class。
所以像 java-Djava.endorsed.dirs=edDir-Dlog4j.configurationFile=log4j.xml -Dlog4j.ignoreTCL=真测试
刚刚使用上面的示例(log4j-core-2.11.0.jar 和 log4j-api-2.11.0.jar)在 eclipse 中构建了您的项目 - 您需要更改您的导入语句并将 Logger 更改为 LogManager:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
LOG.info("information log line");
}
// private static final ExtLogger logger = ExtLogger.create(MyService.class);
private final static Logger LOG = LogManager.getLogger(Test.class);
}
问题发生在 log4j 类 由 Bootstrap 类加载器加载时,当在认可目录 (-Djava.endorsed.dirs=...
) 中找到 log4j jar 文件时就会出现这种情况。 Log4j 没有正确处理(请参阅开头 post 中的堆栈跟踪)。
问题已在 log4j 2.11.1 中解决。