2017-07-13 608 views
2

我正在将log4j升级到log4j2。在那个过程中,我得到了Logger Class转换异常。以下是错误。ClasscastException - org.apache.log4j.Logger无法转换为org.owasp.esapi.Logger - 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属性文件)中,我看到对此Logger的引用。 以下是我们旧代码中的代码。

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

现在在log4j2中,我使用了log4j2.xml文件,但没有找到与该行等价的任何标签。请问任何问题,请告诉我如何继续?
注:我到JBoss EAP 7

回答

1

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

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

我的情况: 我只上码头Tomcat的应用服务器测试这一点。我有我自己的日志库环绕log4j2和我使用Scala,而不是Java。

首先,创建ClassCastException的类是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。在库类之前不加载自己的类的应用程序服务器不适用于此解决方案。

+0

感谢您提供您的解决方案henninglh。我会尝试在我的Java代码中使用这个解决方案。我正在使用Jboss EAP 7服务器。我不确定这个类是否可以在库类之前加载。我必须研究。如果您有任何想法,请告诉我。谢谢。 – ATK

+1

嗨Henninglh,非常感谢。这种方法正在工作。感谢分享。 – ATK

0

这个问题isn't solvable.

ESAPI运行我的应用程序对Log4J的1.x的硬依赖,不支持目前Log4j2。

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

+0

感谢您的答复解决了类似的问题。我正在使用log4j bridge jar(log4j-1.2-api-2.8.2.jar)这是否工作正常? – ATK

0

我加入这的log4j.xml

<loggerFactory class="org.owasp.esapi.reference.Log4JLoggerFactory"/> 
相关问题