오래된 자바 프로젝트를 인계 받았다. 그리고 원래 디자이너가 사라졌습니다. 이 프로젝트에서 , 그것은 다음과 같이 정적 인 방식의 log4j를 사용레벨 당 Log4j2에서 로거를 만들 수 있습니까?
public class LogUtil {
private static final String FQCN = LogUtil.class.getName();
private static final Logger logger1 = Logger.getLogger("INFO");
private static final Logger logger2 = Logger.getLogger("ERROR");
public static void info(Object message) {
if (logger1.isInfoEnabled()) {
forcedLog(logger1, Level.INFO, message);
}
}
public static void error(Object message) {
forcedLog(logger2, Level.ERROR, message);
}
private static void forcedLog(Logger logger, Level level, Object message) {
logger.callAppenders(new LoggingEvent(FQCN, logger, level, message, null));
}
}
그런 다음 다른 클래스는 쉽게 LogUtil.error("")
및 LogUtil.info("")
에 로그를 기록 할 수 있습니다. INFO 로거와 ERROR 로거는 별도의 파일로 작성되었습니다.
하지만 Log4j2에서 LoggingEvent 클래스를 찾을 수 없습니다.
Log4j2를 사용하려면이 클래스를 어떻게 수정해야합니까? (아마도 log4j 패키지에 제공된 Log4j 1.x 브리지를 사용 하시겠습니까?)
이런 식으로 로거를 사용하는 것이 합리적입니까? 그것은 클래스 당 로거를 만드는 것보다 쉽습니다 보인다. 성능이나 다른 문제가 있습니까?
답장을 보내 주셔서 감사합니다. 당신이 말했던 것처럼, 클래스 당 하나의 로거는 몇몇 클래스에 의해 인쇄 된 로그를보다 유연하게 제어 할 수 있습니다. – Tidus
첫 번째 방법을 시도했지만 로그 추적은 모두 비슷했습니다. 'LogUtil.info (LogUtil.java:23) test' 실제 장소 LogUtil.정보가 로그에 인쇄되지 않았습니다. 로그의 실제 위치를 기록하려면 logger.info()를 직접 호출해야합니다. 나는 로거를 작성하려고 생각했다. 'logger = LogManager.getLogger (ClassA.class); ' 클래스'name '을 가진 모든 클래스에 구현하는 데 약간의 시간이 걸릴 수있다. 나는 길을 찾고 LogUtil.info()를 logger.info()로 바꿀 것이다. 감사합니다. . – Tidus
로거 선언에서 클래스 이름을 사용하는 것과 관련하여 어떤 의미인지 알 수 있습니다. log4j2는 제로 파라미터를 취하는'getLogger()'메소드를 제공한다. [log4j2 API 문서] (https://logging.apache.org/log4j/2.x/manual/api.html) - "로거 이름"에 대한 마지막 절 참조 –