개발을 하면서 로그를 남긴다는 것은 아주 중요한 일이다. 특히 24시간 365일 내내 돌아가는 프로그램들... 하지만 그렇다고 무분별하게 사용하다가는 정작 체크해야 할 심각한 에러로그들을 지나칠 수 있으니 적정 수준의 로그 레벨로 구분하여 사용하는 것이 중요하다.
로그(Log)란?
프로그램 개발이나 운영 시 발생하는 문제점을 추적하거나 운영 상태를 모니터링하기 위한 텍스트이다.
로그 레벨(Log level)이란?
해당 로그 메시지가 얼마나 중요한지를 알려주는 정보이다.
로그 레벨 단계
TRACE > DEBUG > INFO > WARN > ERROR > FATAL
TRACE
- 가장 상세한 로그 레벨로, 애플리케이션의 실행 흐름과 디버깅 정보를 상세히 기록한다. 주로 디버깅 시에 사용된다.
DEBUG
- 디버깅 목적으로 사용되며, 개발 혹은 테스트 단계에서 상세한 정보를 기록한다.
- 애플리케이션의 내부 동작을 이해하고 문제를 분석하는 데 도움을 준다.
- 다른 레벨들과달리 운영 환경에서는 남기고 싶지 않은 로그 메시지를 위한 레벨이다.
INFO
- 작동에 대한 정보성 메시지를 기록한다.
- 애플리케이션의 주요 이벤트나 실행 상태에 대한 정보를 전달한다.
- INFO 로그는 시스템을 파악하는데 유익한 정보만 기록해야한다.
WARN
- 잠재적으로 문제가 될 수 잇는 경고성 메시지를 기록한다.
- 예상치 못한 문제나 잠재적인 오류 상황을 알리는 메시지이다.
- 애플리케이션이 정상적으로 동작하지만 주의가 필요한 상황을 알려준다.
ERROR
- 오류 메시지를 기록한다.
- 심각한 문제 또는 예외 상황을 나타내며, 애플리케이션의 정상적인 동작에 영향을 미칠 수 있는 문제를 알린다.
FATAL
- 가장 심각한 오류 메시지를 기록한다.
- 애플리케이션의 동작을 중단시킬 수 있는 치명적인 오류를 나타낸다.
- 일반적으로 이러한 오류는 복구가 불가능하거나 매우 어려운 상황을 의미한다.
WARN vs ERROR
모든 예외 상황과 오류 상황이 error 일 수는 없다. 일반적이지 않은 예외 상황이 발생했다 하더라고 개발자가 제어 가능하다면 warn으로 두는 것이 좋다.
예를 들면, 외부API 를 사용하는데 log.error("Error occurred", e); 이렇게 예외 상황을 error로 처리하였다고 가정해 보자
function get(url): string {
try {
return api.getCompanyInfo (url);
} catch (e) {
log.error("Error occurred", e);
return "response";
}
}
근데 외부 API 내용이 커서 트래픽이 진짜 많이 발생 한다면 모든 errro 처리된 게 나오게 될 텐데 그렇다면 이 외부 API 때문에 정작 중요한 내용을 놓칠 수도 있다. 그럴 때는 아래와 같이 log.warn("Error occurred", e); 으로 바꿔준다.
function get(url): string {
try {
return api.getCompanyInfo (url);
} catch (e) {
log.warn("Error occurred", e);
return "response";
}
}
또 다른 예시는 사용자에 의해 발생 되는 오류에 관한 것이다. 아래와 같이 사용자의 문제로 error를 나태 내주어야 한다면 가장 중요한 log.error(`id=${id}의 로그인 실패 횟수가 5회를 초과했습니다.`); 내용으로 남기고 그 보다 낮은 수준의 알람이라면 log.warn(`id=${id}의 로그인 정보가 정확하지 않습니다.`); 로 남기는 것이 현명한 로그 레벨을 선택하는 것이다.
export async function validateSignIn(id: string, password: string) {
const matchResult = await userRepository.validateSignIn(id, password);
if(!matchResult.isMatch) {
// ERROR -> WARN
log.warn(`id=${id} 의 로그인 정보가 정확하지 않습니다.`);
throw new Error('로그인 정보가 정확하지 않습니다.');
}
if(matchResult.failCount > 5) {
log.error(`id=${id} 의 로그인 실패 횟수가 5회를 초과했습니다.`);
throw new Error('로그인 실패 횟수 초과로 30분간 로그인을 시도할 수 없습니다.');
}
}
Reference
'JAVA' 카테고리의 다른 글
Java 의 Robot 클래스란? (0) | 2023.08.28 |
---|---|
[Cron] 크론(cron) 표현식 정리 (0) | 2023.08.16 |
로깅을 System.out.println() 로 하면 안되는 이유 (0) | 2023.08.14 |
[JAVA] LocalDate 날짜 비교하기 .isBefore() / .isAfter() / .isEqual() (0) | 2023.08.11 |
[Java] LocalDate에날짜 더하기고 빼기 (plusMonth, minusWeeks) (0) | 2023.08.10 |