우리는 우리 제품에 로그인하기 위해 log4j 1.2.x를 사용하며 가까운 장래에 log4j 2.x로 마이그레이션하려고합니다. 구현 한 기능 중 하나는 생성 된 모든 새로운 롤오버 로그 파일에 시스템 정보와 기타 중요한 매개 변수를 기록하는 것입니다. 우리의 log4j 1.2.x를 구현하는 방법은 우리의 log4j의 RollingFileAppender
클래스를 확장 한과 rollOver()
방법을 대체 한 것으로, 아래 우리는 우리가 log4j2로 마이그레이션 할로 이제 구현log4j2 RollingFileAppender를 사용자 정의하는 방법은 무엇입니까?
@Override
public void rollOver() {
super.rollOver(); //We are not modifying it's default functionality but as soon as rollOver happens we apply our logic
//
// Logic to log required system properties and important parameters.
//
}
의 일부 조각입니다 동일한 기능을 달성하기위한 새로운 솔루션을 모색합니다. 그러나 log4j2의 소스 코드는 이전 소스 코드와 매우 다릅니다. RollingFileAppender
클래스는 RollingManagerhelper
으로 이동되었으므로 rollover()
메서드를 포함하지 않으며 private
으로 설정되었습니다.
완전한 새 패키지를 개발하고 log4j2에서 추상/도우미 클래스를 확장/구현하는 것은 가능한 해결책이지만 우리가 필요로하는 것보다 RollingFileAppender
을 수정하지 않으면 많은 코딩/복사가 필요합니다. 작은 확장. 거기에 간단한 해결책이 있습니까?
UPDATE
나는 답변의 제안에 따라 사용자 정의 조회를 만든 다음 그것을 생성하는 방법이다;
@Plugin(name = "property", category = StrLookup.CATEGORY)
public class CustomLookup extends AbstractLookup {
private static AtomicLong aLong = new AtomicLong(0);
@Override
public String lookup(LogEvent event, String key) {
if (aLong.getAndIncrement() == 0) {
return "this was first call";
}
if (key.equalsIgnoreCase("customKey")) {
return getCustomHeader();
} else {
return "non existing key";
}
}
private static String getCustomHeader() {
// Implementation of custom header
return "custom header string";
}}
그러나 이것은 언급 한대로 작동하지 않았습니다. 이것은 항상 this was first call
을 헤더에 인쇄합니다. 나는 또한 첫 번째 if
조건에 브레이크 포인트를 두어 보았습니다. 그리고 주목할 것은 한 번만 호출된다는 것입니다. 그래서 두려운 것은 log4j2가 xml config에서 속성을 초기화 할 때 customLookup 클래스가 시작시에만 초기화된다는 것입니다. 나는이 사용자 정의 룩업 클래스를 어떻게 구현할 수 있을지 모르겠다.
UPDATE 2
후 I로 다음과 약간 다른 방법을 시도 상기 구현;
private static AtomicLong aLong = new AtomicLong(0);
@Override
public String lookup(LogEvent event, String key) {
return getCustomHeader(key);
}
private static String getCustomHeader(final String key) {
if (aLong.getAndIncrement() == 0) {
return "this was first call";
}
if (key.equalsIgnoreCase("customKey")) {
// Implementation for customKey
return "This is custom header";
} else {
return "non existing key";
}
}
그러나 이것은 같은 것입니다. log4j2는 xml 구성 파일에서 초기화하는 동안 헤더를 만든 다음 메모리의 헤더를 사용합니다. 오버라이드 된 lookup()
메서드의 return
값은 초기화하는 동안에 만 호출되므로 동적으로 변경할 수 없습니다. 더 이상의 도움을 주시면 감사하겠습니다.
런타임 변수 대체를 사용하려면 log4j2 등록 정보 파일에서 변수 키를 지정할 때 double $$를 사용하십시오. – TrueCurry