ClasscastException - org.apache.log4j.Logger 不能强制转换为 org.owa



我正在努力将log4j升级到log4j2。在此过程中,我收到记录器类强制转换异常。下面是错误。

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 属性文件(中,我看到了对此记录器的引用。 下面是我们在旧代码中的代码。

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

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

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

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

埃萨皮。Logger=org.owasp.esapi.reference.JavaLogFactory

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

我遇到了与ATK相同的问题。我最终对其他软件包使用了与 ATK 相同的桥 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
}

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

这个问题是无法解决的。

ESAPI对Log4J 1.x有硬依赖性,目前不支持Log4j2。

有一个开放的增强功能可以使用slf4j,它可能间接支持Log4j2,但目前尚未奏效。

我通过将其添加到log4j来解决了一个类似的问题.xml

<loggerFactory class="org.owasp.esapi.reference.Log4JLoggerFactory"/>

相关内容

最新更新