본문 바로가기
JAVA-Spring

java Slf4j 사용 예제 및 설명

by Super Santj 2023. 7. 22.

Slf4j 홈페이지 일부 이미지

log.info()

production 레벨에서 로그를 info 로 남기는 경우가 있기도 하고 없기도 하다.

활용 설명

  • 남기는 경우
    • 돈과 연관된 행위가 있는 경우, 모든 발자취를 남기고자 log 를 남기기도 함
    • 트래픽이 적어 로그 남기기 부담이 없는 경우 (데이터는 유의미 하다.)
    • batch 프로젝트의 경우 로직이 잘 돌아가고 있는지 여부를 판단하기 위해 로그를 남기기도 한다.
  • 사용하지 않는 경우
    • 트래픽이 너무 많아 로그 보관 비용이 과도하게 발생이 되는 경우
    • logging 로직 만으로도 컴퓨팅 리소스가 아깝다고 생각이 되는 경우

요약

  • info 로그는 결국 비용을 잘 고려 해봐야하는것 같다.

예제

  1. 기본 예제
log.info("user joined room - userId(" + userId + ") roomId(" + roomId + ")");
log.info("user joined room - userId : " + userId + ", roomId : " + roomId);
  1. 치환자 활용 예제
log.info("user joined room - userId({}) roomId({})", userId, roomId);
log.info("user joined room - userId : {}, roomId : {}", userId, roomId);

   // 여러개도 사용이 가능하다.
log.info("user joined room - userId({}) roomId({}) room2Id({})  ... roomNId({})", userId, roomId, room2Id, roomNId);

log.warn()

활용 설명

  1. 많은 트래픽이 발생이 되는 시점에 특정 상황에 대해 로깅을 하고 해당 정보를 잘 식별하고 싶을때 사용하면 유용하다.
  2. 사용방법은 log.info 와 동일하다.
  3. 트래픽이 많은 프로젝트의 경우 info 로그를 남기지 않고 warn 로그에 해당하는 상황만 추려서 보고 싶을때 warn 로그는 로그 수집 툴에 전송하는 형태로 프로젝트를 구성 하기도 한다.
  4. 실제 error 상황이 아니지만, 우리가 의도하는 상황에서 로깅을 하고 싶을때 info와, error 사이 정도의 레벨로 간주하고 남기는 경우가 일반적이다.
  5. 트래픽이 적은 경우 자주 사용하는 로그 형태는 아닌것 같다.

예제

  1. 기본 예제
log.warn("blocked user try join room - userId(" + userId + ") roomId(" + roomId + ")");
log.warn("blocked user try join room - userId : " + userId + ", roomId : " + roomId);
  1. 치환자 활용 예제
log.warn("blocked user try join room - userId({}) roomId({})", userId, roomId);
log.warn("blocked user try join room - userId : {}, roomId : {}", userId, roomId);

// 물론 여러개도 사용이 가능하다.
log.warn("blocked user try join room - userId({}) roomId({}) room2Id({})  ... roomNId({})", userId, roomId, room2Id, roomNId);

log.error()

트래픽을 불문하고 가장 많이 사용하게 되는 로그 형태

활용 설명

  1. error log 의 경우 어떤 프로젝트를 개발 하건 반드시 필요한 로깅 형식이다.
  2. 우리가 작성한 로직이 의도대로 흐르지 않고 예외 상황이 발생 되었을때 반드시 기재해 주는것이 좋다.
  3. 운영 상황에서 갑작스런 서비스 장애로 이어졌을때 장애 원인을 특정할때에 중요한 역할을 하게 되며, 로그를 찾아봐! 라는 선임 개발자분들의 말에 1차적으로 확인 해봐야하는 로그이기도 하다.
  4. 타 언어, 패키지와는 다르게 Slf4j logger interface 는 info|warn 사용법과 error 사용법에 조금 차이가 있다.

예제

  1. 기본 예제
try{
    ...
}catch(Exception error){ // Exception e 로 주로 선언 하지만, 예제의 자세한 설명을 의해 full name 을 사용했다.
    log.error("user join room request error - userId(" + userId + ") roomId(" + roomId + ") errorMessage(" + error + ")";
    log.error("user join room request error - userId : " + userId + ", roomId : " + roomId + ", errorMessage : " + error);
}
  1. 치환자 활용 예제
  • stack trace 미포함시 log.info 와 사용방법은 동일하다.
try{
    ...
}catch(Exception error){
    log.error("user join room request error - userId({}) roomId({})", userId, roomId);
    log.error("user join room request error - userId : {}, roomId : {}", userId, roomId);

    // 여러개도 사용이 가능하다.
    log.error("user join room request error - userId({}) roomId({}) room2Id({})  ... roomNId({})", userId, roomId, room2Id, roomNId);
}
  1. stack trace 활용 예제
  • error log 의 경우 stack trace 가 굉장히 중요한 부분인데, 치환자를 사용할 경우 두번째 파라미터에는 반드시 Throwable 객체가 담겨야 한다.
try{
    ...
}catch(Exception error){
    log.error("error in user purchase unique item - errorMessage({})", error); // OK!
    log.error("error in user purchase unique item - itemId({}) errorMessage({})", itemId, error); // FAILED
    log.error("error in user purchase unique item - userId({}) itemId({}) errorMessage({})", userId, itemId, error); // FAILED
}
  • 만약 stack trace 와 여러개의 데이터를 logging 하고 싶을땐 아래와 같은 방법으로 로깅을 하면 된다.
  • 가독성이 다소 떨어지지만 여러개의 데이터와 stack trace 를 확인 할 수 있다.
try{
    ...
}catch(Exception error){

    // 치환자를 Throwable 객체로 바인딩하여 아래와 같은 방법으로 사용할 수 있다.
    log.error("error in user purchase unique item - userId(" + userId + ") itemId(" + itemId + ") errorMessage({})", error); // OK!

    // 로그 정보를 하나의 매개변수로 바인딩을 해주거나
    log.error("error in user purchase unique item - userId(" + userId + ") itemId(" + itemId + ") errorMessage(" + error + ")"); // OK!
}

댓글