시스템을 작동할 때 시스템의 작동 상태의 기록과 보존, 이용자의 습성 조사 및 시스템 동작의 분석 등을 하기 위해 작동중의 각종 정보를 기록해둘 필요가 있다. 이 기록을 만드는 것을 로깅이라 한다.
즉 로그 시스템의 사용에 관계된 일련의 「사건」을 시간의 경과에 따라 기록하는 것이다.
프로그램을 개발 중, 혹은 완료 후에 발생할 수 있는 오류에 대해 디버깅, 운영 중인 프로그램 상태를 모니터링 하기 위해 필요한 정보를 계속 기록하는 것.
ex. 버그가 발생했을 때 실행 중인 어플리케이션에 무슨 일이 일어났는지 알 수 없기 때문에 로그를 기록, 어떤 일이 있었는지 추측할 수 있다.
로그를 찍을 때 print를 사용하면 성능 문제를 일으킬 수도 있음.
Logging Framework
Apache Commons logging
Log4J
Logback
SLF4J(Simple Logging Facade for Java)
SLF4J
SLF4J(Simple Logging Façade For Java)란 Logging Framework들을 추상화해 놓은 것이며, Facade Pattern을 이용한 Logging Framework입니다.
퍼사드 :
프랑스어 Façade 에서 유래된 단어로 건물의 외관이라는 뜻. 건물의 외벽에서 보면 안의 구조는 보이지 않음.
퍼사드 패턴은 많은 서브시스템(내부 구조)을 거대한 클래스(외벽)로 만들어 감싸서
편리한 인터페이스를 제공해 줍니다.
SLF4J가 제공하는 인터페이스가 외부의 벽을 만들어, 하부에 어떤 Logging Framework가 있는지 알 수 없게 함.
새로운 Logging Framework가 나올때마다 코드를 변경해야 한다면 그것도 엄청난 소요가 될 수 있음.
SLF4J를 사용할 경우 Binding만 바꿔주면 코드를 변경할 필요 없이 성능적 이점을 얻을 수 있다.
로깅 프레임워크의 Binding 모듈
SLF4J가 다양한 로깅 프레임워크를 지원하는데 이는 바인딩 모듈을 통해서 처리된다.
바인딩 모듈은 로깅 프레임워크를 연결하는 역할을 하며, 대표적으로 logback-classic(logback), slf4j-log4j12(log4j2) 등등이 있다.
어플리케이션은 SLF4J를 이용해 로깅 라이브러리가 어떤 것이든 같은 방식으로 로그를 남길 수 있게 해줌.
필요할 때마다 Binding을 바꾸고 Underlying framework를 바꿔서 성능 이점, 업그레이드 등을 진행할 수 있음.
Log Level
어떠한 상황, 환경 별로 Log를 어느정도까지(빈도, 횟수, 양 등) 남길까 결정하는 것.
trace : 흐름 추적.
debug : 디버깅.
info : 정보 수집.
warn : 경고.
error : 심각한 것.
log 레벨을 바꿔가며 로그를 기록하는 정도를 조절할 수 있다.
Logger
Logger는 이름 기반으로 생성.
logback 설정하기
logback 설정파일 찾는 순서
logback-test.xml 파일을 먼저 찾습니다.
없다면 logback.groovy 을 찾습니다.
그래도 없다면 logback.xml을 찾습니다.
모두 없다면 기본 설정 전략을 따릅니다.
test - resources 폴더에 logback-test.xml을 넣음.
resources 두 개가 충돌이 날 수 있음.
test에서 test코드가 실행될 때 logback-test.xml가 우선 적용되도록 함.
test안에 있는 resources 에는 logback-test.xml를 넣음.
밖에 있는 resources 폴더에는 logback.groovy, logback.xml을 넣을 수 있음.
springApplication : 쉽게 실행하게 해주고, 서버구현과 어플리케이션 설정을 도와줌.
SpringBootStarter
스프링부트 스타터를 활용하면 dependency를 간략하고 깔끔학 처리할 수 있다. 노하우가 없고 많이 다뤄보지 않았다면 중복되는 등 dependency가 번잡해질 수 있다.
스프링부트 스타터는 일종의 pom파일이나 maven설정만 들고 있는 프로젝트.
스프링부트 스타터를 이용하면, 스프링의 기본적인 dependency를 설정해준다. 스프링 애플리케이션을 빠르게 설정하고 시작할 수 있게 해준다.
스프링부트는 다양한 종류의 스타터 모듈을 제공한다.
SpringBoot Application
어떻게 구현되어 있는지?
SpringBootConfiguration은 Configuration을 사용
Configuration은 빈을 등록하는 클래스로 사용되고, SpringBootConfiguration도 마찬가지.
둘의 차이점은 스프링부트의 경우 테스트환경에서 스프링부트가 자동으로 찾아짐.
SpringBoot Application에는 대체로 단 하나의 SpringBoot Application을 작성하고, 별도의 컨피규레이션은 용도에 따라 작성함. 최상의 앱 컨피규레션이 되고 딱 하나만 있어야 함.
딱 하나의 스프링부트 컨피규레이션은 스프링부트 애플리케이션을 단 클래스가 하나라는 뜻. 그게 메인메서드가 있는 애플리케이션 클래스가 된다.
스프링부트 애플리케이션을 달면 자동으로 컴포넌트 스캔이 사용되기 때문에, 자동으로 모든 패키지 스캔이 됨.
스프링에플리케이션 클래스에 run이라는 메서드 전달. 빈을 등록하면 context에 자동으로 등록.
스프링애플리케이션 런에서 반환되는 것은 Application Context.
Logger도 사용 가능.
별다른 설정 없이 외부 리소스도 사용 가능. YAML 등.
설정보다 관례를 중시
관례에 따라 기본적으로 설정이 되고, 특별히 적용해야 할 것들에만 설정을 적용하자.
단순성을 확보하고 유연성을 잃지 않을 수 있음.