ClasscastException - org.apache.log4j.Logger 无法转换为 org.owasp.esapi.Logger - log4j 到 log4j2
ClasscastException - org.apache.log4j.Logger cannot be cast to org.owasp.esapi.Logger - log4j to log4j2
我正在努力将 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 属性文件)中,我看到了对此记录器的引用。
下面是我们旧代码中的代码。
log4j.loggerFactory=org.owasp.esapi.reference.Log4JLoggerFactory
现在在 log4j2 中,我正在使用 log4j2.xml 文件,但我没有找到与该行等效的任何标记。任何人都可以建议我如何进行吗?
注意:我是 运行 我在 JBoss EAP 7
中的应用程序
这个问题isn't solvable.
ESAPI 严重依赖 Log4J 1.x,目前不支持 Log4j2。
有一个 open enhancement to use slf4j 可能会间接支持 Log4j2,但目前还没有实现。
这个问题是可以解决的,但这不是一个很好的解决方案,而且是视情况而定。
我遇到了和ATK一样的问题。我最终使用相同的 bridge-api 作为其他包的 ATK,但对于 ESAPI 有一个讨厌的解决方法。
我的情况:
我只在 Jetty 和 Tomcat 应用服务器上测试过。我有自己的 log4j2 日志库,我使用 Scala,而不是 Java。
首先,创建 ClassCastException 的 class 是 org.owasp.esapi.reference.Log4JLogFactory.
我最终创建了包 org.owasp.esapi.reference 并创建了我自己的名为 Log4JLogFactory 的 Scala 对象。该对象扩展了我自己的日志框架(在接下来的示例中命名为 "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。在库 classes 之前不加载您自己的 classes 的应用程序服务器将无法使用此解决方案。
我通过将此添加到 log4j.xml
解决了类似的问题
<loggerFactory class="org.owasp.esapi.reference.Log4JLoggerFactory"/>
您可以将记录器工厂从 ESAPI.properties 文件中的 Log4j1 工厂切换到其他工厂以避免此错误。我没有尝试过,但我想您可以创建一个使用 Log4j2 的自定义日志记录工厂。
以下示例将配置 ESAPI 以使用 JUL 日志记录,从而避免 ClassCastException:
ESAPI.Logger=org.owasp.esapi.reference.JavaLogFactory
我正在努力将 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 属性文件)中,我看到了对此记录器的引用。 下面是我们旧代码中的代码。
log4j.loggerFactory=org.owasp.esapi.reference.Log4JLoggerFactory
现在在 log4j2 中,我正在使用 log4j2.xml 文件,但我没有找到与该行等效的任何标记。任何人都可以建议我如何进行吗?
注意:我是 运行 我在 JBoss EAP 7
这个问题isn't solvable.
ESAPI 严重依赖 Log4J 1.x,目前不支持 Log4j2。
有一个 open enhancement to use slf4j 可能会间接支持 Log4j2,但目前还没有实现。
这个问题是可以解决的,但这不是一个很好的解决方案,而且是视情况而定。
我遇到了和ATK一样的问题。我最终使用相同的 bridge-api 作为其他包的 ATK,但对于 ESAPI 有一个讨厌的解决方法。
我的情况: 我只在 Jetty 和 Tomcat 应用服务器上测试过。我有自己的 log4j2 日志库,我使用 Scala,而不是 Java。
首先,创建 ClassCastException 的 class 是 org.owasp.esapi.reference.Log4JLogFactory.
我最终创建了包 org.owasp.esapi.reference 并创建了我自己的名为 Log4JLogFactory 的 Scala 对象。该对象扩展了我自己的日志框架(在接下来的示例中命名为 "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。在库 classes 之前不加载您自己的 classes 的应用程序服务器将无法使用此解决方案。
我通过将此添加到 log4j.xml
解决了类似的问题<loggerFactory class="org.owasp.esapi.reference.Log4JLoggerFactory"/>
您可以将记录器工厂从 ESAPI.properties 文件中的 Log4j1 工厂切换到其他工厂以避免此错误。我没有尝试过,但我想您可以创建一个使用 Log4j2 的自定义日志记录工厂。
以下示例将配置 ESAPI 以使用 JUL 日志记录,从而避免 ClassCastException:
ESAPI.Logger=org.owasp.esapi.reference.JavaLogFactory