▶ log
로그 기록의 로그이기도 함
목적
기록을 남기고자 할 때 사용
1)콘솔에 찍는 용도
- 프린트메소드 사용하는게 시스템적 관점에서 성능저하가 좀 된다고함
- 많이 찍어야한다고 하면 로그를 많이 사용
2)db에 저장하는 용도
3)파일에 저장하는 용도
- 파일에 가장 많이 사용
- 파일에 먼저 저장하고 db에 저장하는 경우 많음. db는 용량 한계가 있는 경우가 많기에
콘솔에 찍히는 기록도 log
장점
1)파일, DB 등에 저장 가능
- 파일은 stream 통해 저장가능
2)로그 파악이 쉬워 문제 해결이 용이
3)빠르고 효율적인 디버깅 가능
단점
1)코드 양 증가
로그를 하기 위한 설정 코드들이 길다
- 로그를 사용하기 위한 설정정보들을 가지고 와야하는데, 단순하게 콘솔 넣는거만 생각해보더라도 print만 불러오면 되는데 로그를 하기위한 설정 코드들이 꽤 길어서 전체적인 코드양이 꽤 많이 늘어남
2)개발 중간에 로그 코드를 넣기가 어려움
- 전체적으로 코드양 증가 → 개발 중간에 로그 코드를 넣기가 어려움
3)심하게 많이 생성되는 로그는 혼란을 야기하고, 로그 때문에 성능에도 영향이 갈 수 있음
- 문제 해결을 위해 로그를 너무 많이 넣어두면 양이 많아지기 때문
로그에 관한 것들
콘솔에 찍히는 기록
HomeController
logger :인터페이스(Interface)
로그 설정 파일
경로 : src/main/resources
log4j.xml
log4j.xml 안의 태그들
1)Appenders
2)Application Loggers
3)Root Logger
1)Appenders
전달 받은 로그를 어디에 출력할지 결정
ConsoleAppender : 로그를 콘솔에 출력하기 위한 어펜더
JDBCAppender : 로그를 db에 출력하기 위한 어펜더
FileAppender : 로그를 파일에 출력하기 위한 어펜더
- 단점 : 지정 파일에 로그가 계속 남아 크기가 지나치게 커지고 지속적인 로그 관리가 불가능하다는 단점
RollingFileAppender : 파일어펜더를 보완하는 어펜더
- 일정 조건 후에 기존 파일을 백업 파일로 바꾸고 다시 처음부터 시작
- 백업파일이 1-10까지 기록했으면 다음 파일은 11-20까지 기록하는 식
ex)
1-100까지 포문 돌리는 중. 새로 시작하는 지점
1-10까지 담기고 백업파일로
11-20 담기고 백업파일로 담기고
ex. DailyRollingFileAppender : 하루마다 백업
<appender>
<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
</layout>
</appender>
name 어디다 넣을것인지 지정
layout 형식
<layout> : 로그를 어떤 형식으로 출력할 것인지 결정
layout 종류
1)DateLayout
2)HTMLLayout
3)PatternLayout : 디버깅에 가장 적합
4)SimpleLayout
5)XMLLayout
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.**PatternLayout**">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
</layout>
</appender>
<layout> value속성
- %p : debug, info, warn, error, fatal 등의 priority
- %m : 로그 내용 출력
- %d : 로깅 이벤트가 발생한 시간 출력(프로그램 속도를 느리게 할 수 있음)
- - 포맷을 %d{HH:mm:ss, SSS}와 같은 형태로 사용하며 SimpleDateFormat에 따른 포매팅을 하면 됨
- %t : 로깅 이벤트가 발생된 스레드 이름 출력
- %% : % 출력
- %n : 개행문자 출력
- %c : package(카테고리) 출력
- %c{n} : n(숫자)만큼의 package 를 하단부터 역으로 출력
- %C : 호출자의 클래스명 출력 ( 클래스가 대문자로 시작하니 c도 대문자C)
- %f : 로깅이 발생한 프로그램 파일명 출력
- %l : 로깅이 발생한 caller의 정보 출력
- %L : 로깅이 발생한 caller의 라인수 출력
- %M : 로깅이 발생한 method이름 출력
- %r : 애플리케이션 시작 이후부터 로깅이 발생한 시점의 시간(밀리세컨) 출력
<layout> 아래 <param value=””>의 해석 value=”%-5p” : 왼쪽정렬. 그냥5p면 오른쪽정렬
콘솔 어펜더에서 지정하고 있는 패턴이 뭐를 가지고 이용 했는지
내 로그가 어떻게 찍혔는지를 한번 더 확인 해보라
2)Application Loggers
등록된 로그들을 받아주는 역할
name속성에 등록된 영역들을 다 받아서 관리하겠다
<logger name="**com.kh.Spring**">
<level value="info" />
</logger>
등록된 로그들을 받아주는 역할
DEBUG < INFO < WARN < ERROR< FATAL (오른쪽으로 갈 수록 심각한 에러)
설정한 level 이상만 출력
ex) level info라고 지정하면 debug는 안보임
- fatal : 아주 심각한 에러발생
- error : 어떤 요청 처리 중 문제 발생
- warn : 프로그램 실행에는 문제 없지만 향후 시스템 에러의 원인이 될 수 있는 경고성 메세지
- info : 상태 변경과 같은 정보성 메세지
- debug : 개발 시 디버그 용도로 사용하는 메세지
- trace : debug가 너무 광범위한 것들 해결하기 위해 디버그보다 좀 더 상세한 이벤트를 나타냄. 경로추적에서 많이씀
3)Root Logger
모든 자식 2번 <logger>들의 로깅 출력이 3번<root> root logger를 통해 일어남
2번의 모든 로거들은 실행이 되면 3번Root Logger로 찾아옴