ClasscastException - org.apache.log4j.Logger无法强制转换为org.owasp.esapi.Logger - log4j到log4j2

时间:2017-07-13 16:39:15

标签: logging jboss7.x log4j2 esapi

我正在努力将log4j升级到log4j2。在那个过程中,我得到一个Logger Class强制转换异常。以下是错误。

Caused by: java.lang.ClassCastException: org.apache.log4j.Logger cannot be cast to org.owasp.esapi.Logger
    at org.owasp.esapi.reference.Log4JLogFactory.getLogger(Log4JLogFactory.java:88)
    at org.owasp.esapi.ESAPI.getLogger(ESAPI.java:154)
    at org.owasp.esapi.reference.DefaultEncoder.<init>(DefaultEncoder.java:75)
    at org.owasp.esapi.reference.DefaultValidator.<clinit>(DefaultValidator.java:91)
    ... 45 more

在我的旧代码(log4j属性文件)中,我看到了对此Logger的引用。 下面是我们旧代码中的代码。

log4j.loggerFactory=org.owasp.esapi.reference.Log4JLoggerFactory

现在在log4j2中我使用的是log4j2.xml文件,但我找不到与该行等效的任何标记。有什么可以建议我如何进行?
注意:我在JBoss EAP 7中运行我的应用程序

4 个答案:

答案 0 :(得分:2)

此问题isn't solvable.

ESAPI对Log4J 1.x有很强的依赖性,目前还没有支持Log4j2。

有一个open enhancement to use slf4j可能间接支持Log4j2,但目前还没有工作。

答案 1 :(得分:2)

这个问题是可以解决的,但它不是一个很好的解决方案,而且是情境化的。

我和ATK有同样的问题。我最终使用与ATK相同的bridge-api用于其他软件包,但对于ESAPI,有一个讨厌的解决方法。

我的情况: 我只在 Jetty Tomcat 应用服务器上测试了这个。我有自己的日志库包围log4j2和我使用Scala,而不是Java。

首先,创建ClassCastException的类是 org.owasp.esapi.reference.Log4JLogFactory。

我最终创建了包 org.owasp.esapi.reference 并创建了我自己的名为Log4JLogFactory的Scala对象。这个对象扩展了我自己的日志框架(在下一个例子中名为&#34; Logging&#34;)并实现了org.owasp.esapi.LogFactory接口。为了实现这些方法,我只是将日志消息传递给我自己的日志框架。所以log.error(...)方法调用来自我自己的记录器,要实现这个解决方案,你需要自己的。

object Log4JLogFactory extends Logging with org.owasp.esapi.LogFactory {
  private[reference] lazy val factory = new Log4JLoggerFactory
  def getInstance = {
    this
  }

  private val logger = new org.owasp.esapi.Logger {
    override def error(`type`: Logger.EventType, message: String) = log.error(message)

    override def error(`type`: Logger.EventType, message: String, throwable: Throwable) = log.error(message, throwable)

    // implement the rest of the methods that is needed...
  }

  override def getLogger(clazz: Class[_]) = logger

  override def getLogger(moduleName: String) = logger
}

NB!此解决方案适用于Jetty和Tomcat。在库类之前不加载您自己的类的应用程序服务器将无法使用此解决方案。

答案 2 :(得分:1)

我通过将此添加到log4j.xml

解决了类似的问题
<loggerFactory class="org.owasp.esapi.reference.Log4JLoggerFactory"/>

答案 3 :(得分:0)

您可以将记录器工厂从ESAPI.properties文件中的Log4j1工厂切换到其他位置,以避免此错误。我没有尝试过,但我想您可以创建一个使用Log4j2的自定义日志记录工厂。

以下示例将ESAPI配置为使用JUL日志记录,这避免了ClassCastException:

ESAPI.Logger = org.owasp.esapi.reference.JavaLogFactory