使用来自认可目录的 log4j2

  • 本文关键字:log4j2 java log4j2 jacorb
  • 更新时间 :
  • 英文 :


我的示例代码就是这么简单:

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.jarlog4j-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=true

此参数似乎旨在查找所有类加载器上的类。

所以像 java -Djava.endorsed.dirs=edDir -Dlog4j.configurationFile=log4j.xml -dlog4j.ignoreTCL=true Test

刚刚使用上面的示例(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 类由引导类加载器加载时出现问题,当在认可的目录 (-Djava.endorsed.dirs=...中找到 log4j jar 文件时就是这种情况。Log4j 没有正确处理这个问题(请参阅打开帖子中的堆栈跟踪(。

此问题已在 log4j 2.11.1 中解决。

最新更新