log4j2 로 마이그레이션


22.1 마이너 업데이트 1 릴리스에서는 IBM Sterling® Order Management 시스템에서 로깅에 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에서 지원되지 않으므로 변경할 수 없습니다. 로그 레벨의 추가 관리는 코드에 의해 수행되며, 확장 로깅을 원하는 코드의 특정 부분에 대한 추적을 작성해야 합니다.
  • 호출하는 경우 isEnabledFor(Level level) isInfoEnabled 또는 isTimerEnabled 같은 특정 메서드로 대체하세요.
log4j-1.2.17.jar제거

Sterling Order Management 시스템 은 보안상의 이유로 제공된 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) 클래스를 직접 사용하지 않도록 권장합니다. Sterling Order Management 시스템에서 기본 로깅 API의 변경사항에 노출되지 않도록 하는 YFCLogCategory를 사용할 수 있습니다.

1.2.17 버전 이전의 사용자 정의 패키지에서 log4j 1.x Jar 파일을 패키징하는 경우 및 사용자 정의 코드 종속성을 지원하기 위해 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 Jar에 종속된 써드파티 라이브러리가 있는 경우, 사용자 정의 패키지에서 패키징하는 써드파티 Jar 파일의 추출된 컨텐츠에 대해 다음 명령을 실행하여 해당 Jar를 검색하십시오.

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

이 명령은 log4j 1.x Jar에 대한 종속성이 있는 클래스를 인쇄합니다. 결과를 찾으면 해당 Jar 파일의 업데이트된 버전이 사용 가능한지 확인해야 합니다.

일부 로깅 관련 써드파티 라이브러리 (예: slf4j 또는 commons-logging) 에는 log4j 1.x Jar 종속성이 있을 수 있지만 이러한 라이브러리를 무시할 수 있습니다.