Spring/Tistory

블로그-V3. Log4j

JJJAEOoni 2022. 6. 2. 12:12
반응형

GlobalExceptionHandler은 클라이언트에게 보여주는 로그이지, 파일로 남진 않는다.
모니터 출력만 해준다. stdout(표준(모니터) 출력)

모니터 출력 stdout(표준(모니터) 출력)
키보드 입력 stdin(표준(키보드) 입력)

내가 GUI에서 마우스 클릭을 해도 실제로는 명령어가 실행된다.


에러 stderr(표준 에러)

키보드로 표준 입력을 했을 때 2가지 결과가 나올 수 있다.

표준 출력 혹은 표준 에러

 



stdout, stdin, stderr는 OS가 들고있는 기능이다.

자바에서 이 기능을 사용하고 싶다면 system call해서 사용한다.

System.in → 표준 입력
System.out → 표준 출력 1 (디폴트)
System.err → 표준 에러 2

이게 OS의 기능을 system call 한 것이다.

파이썬의 print 또한 stdout을 system call한것이다.

java -jar 파일명 1 > 모니터

> : OS 리다이렉션 문법
어떤 내 결과를 파일에 뿌릴지 로그로 뿌릴지?

출력 기본이 모니터이다.

이러면 실제 배포를 했을 때 서버가 종료되면 로그가 다 날아가서 서버관리자가 확인하지 못한다.

java -jar 파일명 1 > std.out 파일로 저장

 




sysout은 로그 레벨의 단계가 없다.


Logger 사용 (Log4j 라이브러리) 로그 관리 가능 → debug info warn error

개발 단계에서는 log.debug("hi");

이런식으로 막 남겨도 된다.


배포 환경에서는 필요 없는 코드를 보지 않기 위해 로그 단계를 설정 파일에 설정해놓을 수 있다.


로그 단계를 debug로 잡으면 debug부터 error 로그까지 다 출력된다.

근데 로그 단계를 info로 설정하면 debug 로그는 배포 환경에 출력되지 않는다.

nohup java -jar 파일명 &
터미널에 돌지않고 백그라운드로 실행
이때 출력은 nohup.out 파일로 로그들이 저장된다. 자동으로!


로그 단계는 내가 정할 수 있다. 설정파일에.
로그에 어떤 문제가 생겼는지 파일에서 확인할 수 있다.

 

application-dev.yml

logging:
  level:
    '[org.springframework.web]': DEBUG
    '[org.hibernate]': DEBUG

 

application-prod.yml

logging:
  level:
    '[org.springframework.web]': INFO
    '[org.hibernate]': INFO



모든 에러들은 globalExceptionHandler로 모이니까 여기서 에러 로그를 남겨주자.

info나 warn 로그는 핸들러로 안오니까 나중에 AOP 처리해줄것이다.

 

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(CustomApiException.class)
    public ResponseEntity<?> apiException(Exception e) { // fetch 요청 시 발동 -> json 응답
        log.error("에러 발생 : " + e.getMessage());
        return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler(CustomException.class)
    public String htmlException(Exception e) { // 일반적인 Get(a태그), Post(form태그) 요청 -> html 응답
        log.error("에러 발생 : " + e.getMessage());
        return Script.back(e.getMessage());
    }
}



프로젝트 실행할 때 스타트 디버깅으로 시작하지 않으면
설정파일에 로그레벨을 Debug로 설정해줘야 로그가 남는다.

 

 

디버깅하지않고 시작하면 디폴트가 info 로그부터 출력된다.

 

1. 로그가 사라지지 않고 남아있어야 어떤 에러가 발생하는지 아니까 꼭 배포전에 로그남기기.
2. 테스트 코드 짜기

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 
반응형