2017-07-13 493 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"/> 
相關問題