log4j2 へのマイグレーション


22.1 マイナーアップデート 1 リリースでは、 IBM Sterling® Order Management System はロギングに log4j2を使用し、 log4j v1.2.17.jar ファイルを出荷しません。

Sterling™ Order Managementシステムコードによって主にロギングに使用され、顧客コードによっても使用される YFCLogCategory クラスは、 log4j 1.x クラスである org.apache.log4j.Category を拡張していません。 YFCLogCategory クラスで定義されていないメソッドを使用している場合、カスタム・コードはこのリリースの影響を受けます。 YFCLogCategory クラスによって定義されておらず、 org.apache.log4j.Category 親クラスから使用可能なメソッドはサポートされません。

22.1 マイナー更新 1 リリースを適用した後、更新されたコア Javadoc のメソッドを確認できます。 カスタム・コードのランタイム障害が発生しないようにするために、以下のメソッドが YFCLogCategory クラスに追加されました。 ただし、これらはダミー・メソッドであり、後のリリースで削除される可能性があります。
  • public void log(Object level, Object obj)
  • public void setLevel(Object level)
  • public boolean isEnabledFor(Object level)
カスタム・コードの変更
重要:

YFCLogCategory.getLogger() メソッドはサポートされていません。 代わりに YFCLogCategory.instance(Class.class) メソッドを使用してください。

例:
private static YFCLogCategory logger = YFCLogCategory.instance(MyClassName.class);
カスタム・コードを確認して、以下の変更を行います。
  • YFCLogCategory インスタンスを org.apache.log4j.Category または org.apache.log4j.Loggerにキャストする場合、これはサポートされません。 YFCLogCategory のインスタンスを org.apache.log4j.Logger または org.apache.log4j.Category にキャストしても、新規コードの作成時にコンパイルされません。 これらのキャストがある既存のカスタム・コードの場合、カスタム・コードは実行時に ClassCastException を検出します。 例えば、以下のコード・パターンの行 #2 および #3 はサポートされていません。
    YFCLogCategory LOGGER = YFCLogCategory.instance(MyClass.class.getName());
    org.apache.log4j.Logger apLogger=(org.apache.log4j.Logger)LOGGER;          // Not supported
    org.apache.log4j.Category apCategory=(org.apache.log4j.Category)LOGGER;    // Not supported
  • log(Level level, Object)を呼び出す場合は、 YFCLogCategory クラスによって提供される error (Object)debug (Object) などの特定のメソッドに置き換えます。
  • setLevel(Level level)を呼び出す場合は、削除する必要があります。 log4j2 は log4j2 API ではサポートされないため、log4j2 でロガーのレベルを変更することはできません。 ログ・レベルのさらなる管理はコードによって行われ、拡張ロギングの対象となるコードの特定の部分に対してトレースを作成する必要があります。
  • isEnabledFor(Level level)呼び出す場合は、isInfoEnabled isTimerEnabledなどの特定のメソッドに置き換えてください。
log4j-1.2.17.jarの取り外し

Sterling Order Management System は、セキュリティー上の理由から、出荷された Jar から log4j 1.2.17 Jar を除去しているため、 org.apache.log4j.* クラスへのすべての直接呼び出しを除去する必要があります。 org.apache.log4j.* クラスの呼び出しまたはインポートを削除できない場合は、 Apache 公式サイトからダウンロードして、 log4j 1.2.17 Jar をカスタマイズ・パッケージに含める必要があります。

以下のコード変更を行います。
  • org.apache.log4j.Logger を削除し、 YFCLogCategoryを使用します。
  • org.apache.log4j.Level を削除し、 YFCLogCategoryで特定のメソッドを使用します。
パッケージ化 log4j-1.2.17.jar

IBM では、 Apache log4j (v2 または v1) クラスを直接使用しないことをお勧めします。 YFCLogCategoryを使用することができます。これにより、 Sterling Order Management Systemの基礎となるロギング API の変更に公開されなくなります。

log4j 1.x Jar をカスタマイズ・パッケージ ( 1.2.17 バージョンより前) にパッケージ化していて、カスタム・コード依存関係をサポートするために log4j 1.x Jar が必要な場合は、古い Jar とパッケージ log4j-1.2.17.jarを削除する必要があります。
注: パッケージ化 log4j-1.2.17.jar は一時的なオプションです。 log4j-1.2.17.jar は非推奨になり、 Apacheからのサポートは提供されません。 IBM は、将来のリリースで log4j-1.2.17.jar のパッケージ化を制限します。
サード・パーティー・ライブラリー

log4j 1.x Jars に依存するサード・パーティー・ライブラリーがある場合は、カスタマイズ・パッケージにパッケージ化するサード・パーティー Jar ファイルの解凍された内容に対して以下のコマンドを実行して、そのような Jar を検索します。

jar -xvf <third-party jar>
grep -rnw 'org.apache.log4j'

このコマンドは、 log4j 1.x Jar に依存するクラスを出力します。 結果が見つかった場合は、その Jar ファイルの更新バージョンが使用可能かどうかを確認する必要があります。

slf4j や commons-logging などの一部のロギング関連サード・パーティー・ライブラリーには log4j 1.x Jar 依存関係がある場合がありますが、これらのライブラリーは無視してかまいません。