2017-07-13 26 views
2

私はlog4jをlog4j2にアップグレードしています。そのプロセスでは、Loggerクラスのキャスト例外が発生しています。以下はエラーです。ClasscastException - org.apache.log4j.Loggerをorg.owasp.esapi.Loggerにキャストできません - log4j to 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と私はスカラ、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 
} 

NB!このソリューションはJettyとTomcatで動作します。ライブラリクラスの前に独自のクラスをロードしないアプリケーションサーバーは、このソリューションでは動作しません。

+0

あなたのソリューションhenninglhを提供していただきありがとうございます。私はJavaコードでこのソリューションを使用しようとします。私はJboss EAP 7サーバを使用しています。このクラスがライブラリクラスの前にロードできるかどうかはわかりません。私は研究しなければならない。あなたが何か考えているなら私に知らせてください。ありがとう。 – ATK

+1

こんにちはHenninglh、ありがとう。このアプローチは有効です。共有してくれてありがとう。 – ATK

0

この問題isn't solvable.

ESAPIは、Log4Jの1.xの上の強い依存関係を持っており、現在サポートLog4j2ではありません。

Log4j2を間接的にサポートする可能性があるopen enhancement to use slf4jがありますが、現在のところこれは機能していません。

+0

感謝をlog4j.xmlがこれを追加することにより、同様の問題を解決しました。私はlog4jブリッジjarを使用しています(log4j-1.2-api-2.8.2.jar)これは機能しますか? – ATK

0

私はあなたの返事のため

<loggerFactory class="org.owasp.esapi.reference.Log4JLoggerFactory"/> 
関連する問題