はじめに
JBoss EAP 7.4上のWebアプリケーションをlog4jからlog4j2にバージョンアップした。
環境
- java11
- Windows 11
- JBoss EAP 7.4.0
- TERASOLUNA Server Framework for Java 5.7.3.RELEASE (5.5からバージョンアップ)
- log4j 2.20.0 (1.2.17からのバージョンアップ)
mavenでビルドしている。
やったこと
loggerの変更
log4j2を使用するにあたり、loggerをLogManagerから取得するよう変更しました。
importするライブラリの変更
// import org.apache.log4j.Logger;
// ↓
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
コード変更
//private static Logger logger = Logger.getLogger
// ↓
private static Logger logger = LogManager.getLogger
NDC(Nested Diagnostic Context)からThreadContextへの変更
log4j2にはNDCではなくThreadContextを使用するとのこと。
importするライブラリの変更
// import org.apache.log4j.NDC;
// ↓
import org.apache.logging.log4j.ThreadContext;
コード変更
// NDC.remove();
// NDC.push(xx);
// ↓
ThreadContext.clearAll();
ThreadContext.push(xx);
問題
JBoss起動時に"java.lang.NoSuchFieldError: EMPTY_BYTE_ARRAY"のエラーが発生。(ログ抜粋)
$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
at org.jboss.threads@2.4.0.Final-redhat-00001//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
at java.base/java.lang.Thread.run(Thread.java:834)
at org.jboss.threads@2.4.0.Final-redhat-00001//org.jboss.threads.JBossThread.run(JBossThread.java:513)
Caused by: java.lang.NoSuchFieldError: EMPTY_BYTE_ARRAY
対応
log4j2のコアライブラリ(アプリ側)とAPIライブラリ(JBoss側)のバージョンが一致していないとのことで、jboss-deployment-structure.xmlを作成してJBossのlog4jAPIをアプリケーションから使用できないようにした。
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.apache.logging.log4j.api"/>
</exclusions>
</deployment>
</jboss-deployment-structure>