로깅
업무 프로그램에서 어떤 컨텐츠를 로그에 기록하는 방법을 설명한다.
로그 레벨과 로깅 내용
로그 레벨 | 로깅 내용 | 개발 | 테스트 | 운영 |
---|---|---|---|---|
DEBUG |
개발 환경에서 디버긴 목적으로 출력한다. 무의미한 문장열 등은 개발이 완료되면 삭제한다. |
O |
X |
X |
INFO |
테스트, 검증 목적의 메시지만 출력한다. |
O |
O |
X |
WARN |
운영 환경에서 운영자에 의해 확인이 필요한 내용을 출력한다. 장애 원인을 추적할 목적으로 출력한다. |
O |
O |
O |
ERROR |
오류(장애, 이상)가 발생한 경우 그 내용을 출력한다. Exception 발생 로그도 ERROR 레벨을 사용한다. |
O |
O |
O |
-
DEBUG > INFO > WARN > ERROR 순으로 로그 레벨이 낮아지면 출력 내용이 적어진다.
-
낮은 레벨로 남긴 로그는 높은 레벨에서도 출력된다. (서버 설정이 DEBUG일 때 INFO로 코딩된 로그도 출력된다.)
-
업무 개발시 warn 또는 error 레벨의 로깅은 최소화한다. 거래가 빈번한 운영 환경에서 예기치 않은 성능 손실과 로그 과다 현상을 초래할 수 있기 때문이다. 그리고 필요한 경우라면 특정 거래의 로그 레벨을 거래 파라미터 관리에서 변경할 수 있다.
로깅 방법
org.slf4j.Logger를 사용하며, 아래와 같이 logger 객체를 멤버 변수로 선언한다.
private final Logger logger = LoggerFactory.getLogger(this.getClass());
debug, info, warn, error 메소드
// 고정 문자열 로깅
logger.debug("로깅 내용");
// IO, VO 객체 로깅
logger.debug("로깅 내용 : {}", input);
// 개별 필드 로깅
logger.debug("로깅 내용 : {}", input.getBizCd());
// N개의 항목 로깅
logger.debug("로깅 내용1 : {}, 내용2 : {}, 내용3 : {}", input.getEmpNo(), input.getEmpNm(), input.getHireDt());
Exception 객체 로깅
logger.error("접수 처리중 에러", e);
주의 사항
로그 출력 시 연산과 업무 로직 호출을 수행하지 않는다.
올바르지 않은 케이스
// String 연산
logger.debug("입력 내용 : {}", input.getNodeNm() + "-" + input.getInstanceNm());
// toString()은 String 연산을 발생시킨다.
logger.debug("입력 내용 : {}", input.toString());
// 업루 로직을 로그 안에서 직접 호출하는 경우
logger.debug("계산 결과 값 : {}", calculateAmt(input));
올바르지 않은 패턴의 로깅이나 많은 내용의 로깅이 반드시 필요하다면 조건문을 추가한다.
if (logger.isDebugEnabled()) {
/* 로그 출력 */
}
로그 레벨 변경
개발 환경의 디폴트 로그 레벨은 DEBUG이다.
로그 레벨은 BXCM Web Admin에 접속하여 [온라인 관리 - 거래 파라미터 관리] 메뉴에서 변경할 수 있다.