2016-11-07 8 views
3

WebLogic에서 JBoss EAP 7로 여러 기존 애플리케이션을 포팅했습니다. 포팅되는 구성 요소 중 일부는 EJB입니다. 다른 EJB는 이러한 EJB를 호출하는 서블릿 애플리케이션입니다. 이러한 EJB는 ejb-jar에 배포됩니다. 나는이 모든 것을 큰 EAR 파일로 감쌀 수 있다는 것을 알고 있지만 그렇게하고 싶지는 않습니다. 서블릿과 EJB jar는 개별적으로 배포 가능한 구성 요소 여야합니다.JBoss EAP 7의 EJB jar에 log4j2 로깅 코드

로깅 설정이 있습니다. 우리는 log4j2를 사용하고 있으며 JBoss 로깅 설정과 독립적으로 유지하려고합니다. 적절한 종속성을 가진 모든 log4j2 jar를 포함하는 JBoss 모듈을 만들었고 로깅이 작동합니다. 서블릿이 실행 및 기록되고 EJB를 호출하며 작동합니다.

유일한 문제점은 EJB 로깅을 구성하는 방법입니다. 서블릿과 같은 웹 애플리케이션에서는 web.xml에 log4j 로깅 구성 파일을 지정하기 만하면됩니다. ejb 항아리의 아날로그는 무엇입니까? 나는 방법을 생각할 수 없었다.

나는 다음을 시도했다 : 로거/appender를 EJB 패키지의 서블릿 app 구성에 추가하고 새 파일을 지정한다. 작동하지 않습니다. 새로운 로그 파일은 생성되지만 아무것도 로그 파일에 기록되지 않습니다. 출력이 있어야하지만 EJB가 실행될 때 LogManager가 서블릿에 지정된 구성을 사용하지 않고있는 것은 분명합니다.

JBoss EAP7의 EJB jar에 배포 된 EJB에서 log4j2 구성을 지정하는 올바른 방법은 무엇입니까?

+1

'JndiContextSelector'가 작동할까요? https://logging.apache.org/log4j/2.0/log4j-core/apidocs/org/apache/logging/log4j/core/selector/JndiContextSelector.html 그리고 이것을 납치하지 말고 어떻게해야하는지에 대한 의견이 있으면 WildFly와 함께 log4j2를 사용 하시길 바랍니다. https://issues.jboss.org/browse/WFCORE-482 :) –

+0

Thanks, James. 나는 이것에 대해 생각하고 있었다. 그것은 효과가있을 것 같았지만 첫 번째 시도는 실패했습니다. 의심의 여지가 뭔가 잘못된 일을했지만 적어도 내가 옳은 길을 가고 있었다는 것을 아는 것이 좋다.아마 당신은 http://mail-archives.apache.org/mod_mbox/logging-log4j-user/201611.mbox/browser를보고 내가 잘못한 것을 말해 줄 수 있습니다. –

+0

I * think * 당신은 단지'Log4jContextSelector' 시스템 속성을 설정할 수 있습니다. https://logging.apache.org/log4j/2.x/manual/configuration.html. 나는 이것을 시험하지 않았다. –

답변

0

이전에이 공간에 @postConstruct 및 @preDestroy 메서드를 사용하여 LoggerContext 객체를 초기화하고 종료하는 솔루션을 게시했습니다.

이 계획은 무 상태 세션 콩으로 확장하려고 시도했을 때 무너졌습니다. Stateful Beans는 괜찮습니다. 또는 그래서 나는 생각했다. 결국 나는 내가 한 일의 약점을 드러낸 Oracle document on EJB Restrictions을 발견했습니다. 내 "솔루션"에는 EJB 클래스의 최종 정적 LoggerContext 멤버가 포함되었습니다. 상태를 유지할 수있는 방법을 찾았습니다. 그러나 나는 점점 더 나의 접근 방식에 불만을 갖게되었다. 상태 유지의 경우에도 클러스터 된 환경에서 나중에 나를 괴롭힐 수있는 문제점을 발견했습니다.

지금 내가 믿기 시작한 것은 내가하려고 한 일을해서는 안된다는 것입니다.

EJB가 클러스터의 다른 컴퓨터에 배포 된 경우 static final LoggerContext의 복잡성을 상상할 수도 없습니다. LoggerContext와 같은 객체는 EJB와 같은 컨테이너 관리 객체의 정적 또는 비 멤버 구성원이 아닙니다.

EJB가 내가 구현하려고하는 것에 대한 올바른 구현 기술이라고는 명확하지 않습니다. 내 사용 사례는 실제로 트랜잭션 적이 아니므로 EJB 구현의 경우 강력하지 않으므로 가능한 한 경로가 EJB에서 완전히 벗어납니다.

실제 메시지는 EJB 또는 기타 컨테이너 관리 구성 요소가 표시되면 컨테이너 제공 로깅 시스템을 사용하는 것이 가장 좋습니다. log4j2를 좋아하지만 JBoss가 지원하기 전까지는 컨테이너 제공 log4j1 또는 다른 프레임 워크를 사용하는 것이 가장 좋습니다.