로깅의 목적
- 로깅은 주로 소프트웨어 개발 및 운영에서 사용되는 기술로, 애플리케이션의 실행 중에 발생하는 이벤트 및 정보를 기록하는 것을 의미
- 애플리케이션의 동작 상태, 오류, 경고, 정보 등을 기록함으로써 애플리케이션의 동작을 추적하고 이해하는데 도움을 준다
- 로깅의 목적
디버깅: 애플리케이션에서 발생한 오류를 추적하고 디버깅하는데 도움을 줍니다. 로그를 통해 오류가 발생한 시간, 위치, 상황 등을 파악하여 문제를 해결할 수 있습니다.
성능 모니터링: 로그를 통해 애플리케이션의 성능을 모니터링하고 병목 현상을 찾아내는데 도움을 줍니다. 로그를 분석하여 애플리케이션의 작동 시간, 데이터 처리량, 리소스 사용량 등을 파악할 수 있습니다.
보안 감시: 로그를 통해 애플리케이션에 대한 악의적인 접근 시도나 보안 위협을 탐지할 수 있습니다. 로그를 분석하여 이상한 접근 패턴이나 애플리케이션의 취약점을 식별할 수 있습니다.
오디팅: 로그를 사용하여 애플리케이션의 사용자 활동을 기록하고 감사할 수 있습니다. 로그를 분석하여 특정 사용자의 행동을 추적하거나 관리자에게 보고할 수 있습니다.
- 로깅은 애플리케이션의 안정성, 성능, 보안 등을 개선하고 문제를 해결하는데 중요한 역할을 합니다.
로깅(Logging) 예시
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld{
private final Logger log = LoggerFactory.getLogger(HelloWorld.class.getName());
public String logTest() {
log.trace(" trace log={}", name);
log.debug(" debug log={}", name);
log.warn(" warn log={}", name);
log.info(" info log={}", name);
log.error(" error log={}", name);
return "Logging!!";
}
}
내용
- application.properties 에서
trace로 해놓으면 trace ~ error 까지 전부 출력
- 로그레벨을 지정해 놓으면 그 하위레벨들을 출력
- 일반적으로 다음과 같이 로깅 지정
- 개발 서버 : debug
- 로컬 서버 : trace
- 운영서버 : info
- application.properties에서 로그레벨을 설정하지 않으면 info부터 로그가 출력됨
- logging.level.root = debug : 이런식으로 패키지 이름을 root로 지정하면 모든 패키지의 로그레벨을 지정할 수 있음
- 클래스 위에 @Slf4j 를 적어주면 private final Logger log = LoggerFactory.getLogger(getClass());를 생략 가능
- 로그를 입력할때
log.trace("trace log = " + name) 이런식으로 사용하지 않는 이유
- 해당 텍스트를 입력하면서 연산이 발생하는데 연산이 무조건 들어가는것은 심각한 자원낭비가 될 가능성이 높다
- log.trace("trace log = {}", name) 이렇게 사용하면 실행할때 parameter가 들어가기 때문에 자원낭비가 발생하지 않는다.