log.info()
production 레벨에서 로그를 info 로 남기는 경우가 있기도 하고 없기도 하다.
활용 설명
- 남기는 경우
- 돈과 연관된 행위가 있는 경우, 모든 발자취를 남기고자 log 를 남기기도 함
- 트래픽이 적어 로그 남기기 부담이 없는 경우 (데이터는 유의미 하다.)
- batch 프로젝트의 경우 로직이 잘 돌아가고 있는지 여부를 판단하기 위해 로그를 남기기도 한다.
- 사용하지 않는 경우
- 트래픽이 너무 많아 로그 보관 비용이 과도하게 발생이 되는 경우
- logging 로직 만으로도 컴퓨팅 리소스가 아깝다고 생각이 되는 경우
요약
- info 로그는 결국 비용을 잘 고려 해봐야하는것 같다.
예제
- 기본 예제
log.info("user joined room - userId(" + userId + ") roomId(" + roomId + ")");
log.info("user joined room - userId : " + userId + ", roomId : " + roomId);
- 치환자 활용 예제
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()
활용 설명
- 많은 트래픽이 발생이 되는 시점에 특정 상황에 대해 로깅을 하고 해당 정보를 잘 식별하고 싶을때 사용하면 유용하다.
- 사용방법은 log.info 와 동일하다.
- 트래픽이 많은 프로젝트의 경우 info 로그를 남기지 않고 warn 로그에 해당하는 상황만 추려서 보고 싶을때 warn 로그는 로그 수집 툴에 전송하는 형태로 프로젝트를 구성 하기도 한다.
- 실제 error 상황이 아니지만, 우리가 의도하는 상황에서 로깅을 하고 싶을때 info와, error 사이 정도의 레벨로 간주하고 남기는 경우가 일반적이다.
- 트래픽이 적은 경우 자주 사용하는 로그 형태는 아닌것 같다.
예제
- 기본 예제
log.warn("blocked user try join room - userId(" + userId + ") roomId(" + roomId + ")");
log.warn("blocked user try join room - userId : " + userId + ", roomId : " + roomId);
- 치환자 활용 예제
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()
트래픽을 불문하고 가장 많이 사용하게 되는 로그 형태
활용 설명
- error log 의 경우 어떤 프로젝트를 개발 하건 반드시 필요한 로깅 형식이다.
- 우리가 작성한 로직이 의도대로 흐르지 않고 예외 상황이 발생 되었을때 반드시 기재해 주는것이 좋다.
- 운영 상황에서 갑작스런 서비스 장애로 이어졌을때 장애 원인을 특정할때에 중요한 역할을 하게 되며, 로그를 찾아봐! 라는 선임 개발자분들의 말에 1차적으로 확인 해봐야하는 로그이기도 하다.
- 타 언어, 패키지와는 다르게 Slf4j logger interface 는 info|warn 사용법과 error 사용법에 조금 차이가 있다.
예제
- 기본 예제
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);
}
- 치환자 활용 예제
- 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);
}
- 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!
}
'JAVA-Spring' 카테고리의 다른 글
Thread (0) | 2019.08.01 |
---|---|
JAVA 자바 [ 프로그래밍 ] ArrayList (0) | 2019.07.31 |
JAVA 자바 [ 프로그래밍 ] 인터페이스 종류, 컬렉션, 제너릭 (0) | 2019.07.31 |
JAVA 자바 [ 객체 지향 프로그래밍 ] 인터페이스 (0) | 2019.07.24 |
댓글