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

ATK*_*ATK 6 logging esapi jboss7.x log4j2

我正在将 log4j 升级到 log4j2。在那个过程中,我收到了一个 Logger 类转换异常。下面是错误。

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
Run Code Online (Sandbox Code Playgroud)

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

log4j.loggerFactory=org.owasp.esapi.reference.Log4JLoggerFactory
Run Code Online (Sandbox Code Playgroud)

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

Tra*_*ger 5

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

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

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

  • 这个评论是金子。谢谢你!彻底解决了我的问题。 (2认同)

小智 3

这个问题是可以解决的,但这不是一个好的解决方案,而且是视情况而定的。

我也遇到过和ATK一样的问题。我最终对其他包使用了与 ATK 相同的bridge-api,但对于 ESAPI 有一个令人讨厌的解决方法。

我的情况: 我只在JettyTomcat应用服务器上进行了测试。我有自己的日志库围绕 log4j2,并且我使用 Scala,而不是 Java。

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

我最终创建了包org.owasp.esapi.reference并创建了我自己的 Scala 对象,名为 Log4JLogFactory。该对象扩展了我自己的日志记录框架(在接下来的示例中名为“Logging”)并实现了 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
}
Run Code Online (Sandbox Code Playgroud)

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