반응형
01. log4j.xml 파일이란?
- 어떻게 기록되어질것인가를 설정하는 환경설정 파일
- spring의 로그구현체 제공
- 지난번 mybatis에는 우리가 직접 만들었지만, 이번에는 우리가 직접 만들지 않아도 됨
- 스프링은 기본적으로 로그구현체는 제공하나, 원하는 형태로 제공해주지는 않으므로 조금 변경해서 사용해야함
- 주의 ) 필요하다면 main 프로그램 과 test 프로그램 각각 설정 변경해줘야함
02. log4j.xml의 에러의 문제점 및 해결법
1) log4j.xml의 에러의 문제점
- 해당 경로에 dtd 파일이 없다며 에러가 떨어짐
- 하지만 원래 파일은 있음!! 어디에? maven 라이브러리 >> log4j.jar 파일 >>
- 하지만 log4j는 검은색이라 평소에는 빌드안되다가 실행될 때 빌드됨
- 그래서 에러가 나는 것임 ( 어둡다? = 현재는 빌드되어있지않고, 어떠한 상태가 맞을 때 빌드해줄게요)
2) log4j.xml의 에러의 해결법
방법1. spring/pom.xml에서 log4j의 <scope> runtime을 삭제하기
- 삭제안하는 것을 권장.. 그렇다면?
방법2. : 프로젝트 내에 존재하는 파일말고 인터넷상의 dtd파일 : apache가 제공해주는 외부 dtd파일로 수정하기
- 아래처럼 변경하면 됨
<!DOCTYPE log4j:configuration SYSTEM "<http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd>">
03. log4j 사이트
- http://logging.apache.org/log4j/1.2/apidocs 사이트 들어가면 log4j 대한 자세한 문서를 자세히 확인할 수 있음
- 확인할 것 : PatternLayout의 형식, Appender의 종류
Appender의 종류
- org.apache.log4j.DailyRollingFileAppender : 날마다 다르게 기록
- org.apache.log4j.FileAppender : 항상 같은것만 기록
04. 변경된 log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "<http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd>">
<!-- log4j.xml : 로그구현체에 대한 환경설정 파일 -->
<log4j:configuration xmlns:log4j="<http://jakarta.apache.org/log4j/>">
1) console appender
- 콘솔에 %-5p: %c - %m%n 패턴으로 로그를 기록하는 appender
<!-- Appenders -->
<!-- appender : 로그 구현체를 구성하는 클래스를 설정하기 위한 엘리먼트 -->
<!-- name 속성 : appender 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정 -->
<!-- class 속성 : 로그 구현체로 사용하기 위한 클래스를 속성값으로 설정 -->
<!-- => class 속성값으로 설정된 클래스에 따라 로깅정보를 기록하는 방식이 다르게 설정 -->
<!-- => class 속성값으로 설정된 클래스는 반드시 Appender 인터페이스를 상속받아 작성 -->
<!-- => ConsoleAppender 클래스 : 로깅정보를 서버 콘솔에 기록하기 위한 클래스 -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<!-- param : Appender 클래스에 필요한 값을 제공하기 위한 엘리먼트 -->
<param name="Target" value="System.out" />
<!-- layout : 로깅정보를 제공받아 로그 형식을 설정하기 위한 엘리먼트 -->
<!-- class 속성 : 로그 형식 관련 정보를 제공하기 위한 클래스를 속성값으로 설정 -->
<!-- => patternLayout 클래스 : 로그 형식을 작성하기 위한 변환 문자를 제공하는 클래스 -->
<!-- # 변환문자(conversion Character) - 변환문자는 일반문자와 구분하기 위해 % 기호로 시작함 -->
<!-- %c : 패키지가 포함된 클래스의 이름을 기록 - {정수값}을 이용하여 원하는 값만 기록 가능 : 로깅정보를 발생한 클래스가 누구? -->
<!-- => %c{1} : 패키지를 제외한 클래스의 이름만 기록 /ex %c:xyz.itwill.dao.studentDAO/%c{1}:studentDAO/%c{2}:dao.studentDAO -->
<!-- %d : 날짜와 시간을 기록 - {SimpleDateFormat}을 이용하여 원하는 형식으로 기록 : 로깅정보가 발생한 시간은 언제? -->
<!-- => %d{yyyy-MM-dd} : [년-월-일]형식으로 기록 -->
<!-- %m : 로그 이벤트에 의해 생성된 로그메세지를 기록 -->
<!-- %n : 엔터(Enter)를 기록 - 로그 줄바꿈 -->
<!-- %M : 로그 이벤트가 발생된 메소드의 이름을 기록 -->
<!-- %p : 로그 이벤트가 발생된 로그 이벤트 기록 -->
<!-- => 로그 이벤트 : TRACE > DEBUG > INFO > WARNING > ERROR > FATAL -->
<!-- => ex. DEBUG : DEBUG 이상 발생된 로그 이벤트를 기록해줌, TRACE : 무조건 다 기록 - 가장 최하단 -->
<!-- => 일반적으로 DEBUG레벨 or INFO레벨의 이벤트를 많이 사용함 -->
<!-- # 변환문자 자릿수 설정 - %p 변환문자를 이용하여 예제 설정 -->
<!-- %p : 로그 이벤트의 길이만큼 자릿수를 제공받아 기록 -->
<!-- %5p : 로그 이벤트를 5자리(최대 자릿수)를 제공받아 기록 - 오른쪽 정렬 -->
<!-- => 자릿수가 부족하면 기록이 잘리고 남으면 공백으로 처리되어 기록 -->
<!-- %-5p : 로그 이벤트를 5자리(최대 자릿수)를 제공받아 기록 - 왼쪽 정렬 -->
<!-- %.5p : 로그 이벤트를 5자리(최소 자릿수)를 제공받아 기록 (무조건 5자리 이상으로!) - 오른쪽 정렬 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
</layout>
</appender>
2) sample appender
- 콘솔에 %c{1} 클래스의 %M 메소드 - %m%n 패턴으로 로그를 기록하는 appender
- 즉, 클래스마다 다른 메소드가 출력해주는 로그메세지를 콘솔에 기록함
<appender name="sample" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" /><!-- Target명 : System.out -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%c{1} 클래스의 %M 메소드 - %m%n" />
</layout>
</appender>
3) dailyLogFile appender
- 파일에 [%d{HH:mm:ss}]%-5p: %c - %m%n 패턴으로 매일 새로운 로그를 기록하는 appender
<!-- => 실행 후 기록이 잘 되었는지는 spring프로젝트에 커서두고 [F5] 눌러서 확인하기 -->
<appender name="dailyLogFile" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="dailyLog"/><!-- File명 : dailyLog -->
<param name="DatePattern" value=".yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{HH:mm:ss}]%-5p: %c - %m%n" />
</layout>
</appender>
4) logger - 특정 패키지의 클래스 내 발생되는 로그이벤트 기록
<!-- Application Loggers -->
<!-- logger : 특정 패키지의 클래스에서 발생되는 로그 이벤트를 기록하기 위한 엘리먼트 -->
<!-- name 속성 : 패키지 경로를 속성값으로 설정 -->
<logger name="www.itwill.controller">
<!-- level : 패키지에 작성된 클래스에서 발생되는 로그 이벤트를 설정하기 위한 엘리먼트 -->
<level value="info" />
</logger>
<!-- 직접 만든 패키지(xyz.itwill00.log) 내 클래스에 대한 로그 기록 -->
<!-- additivity 속성 : false 또는 true(기본) 중 하나를 속성값으로 설정 -->
<!-- => 속성값이 [false]인 경우 root 엘리먼트의 로그구현체(Appender)를 포함하지 않도록
동작되고, [true]인 경우 root 엘리먼트의 로그구현체(Appender)를 동작되도록 설정 -->
<logger name="xyz.itwill00.log" additivity="false"><!-- => root 엘리먼트의 로그구현체(Appender)는 안쓸게! -->
<level value="info" />
<appender-ref ref="sample" />
<appender-ref ref="dailyLogFile" />
</logger>
<!-- spring에서 제공하는 라이브러리에 대한 로그 기록 -->
<!-- 3rdparty Loggers -->
<logger name="org.springframework.core">
<level value="info" /> <!-- appender-ref을 따로 설정하지 않으면 자동으로 root Appender 이용함 -->
</logger>
<logger name="org.springframework.beans">
<level value="info" />
</logger>
<logger name="org.springframework.context">
<level value="info" />
</logger>
<logger name="org.springframework.web">
<level value="info" />
</logger>
5) root - 모든 클래스 내 발생되는 로그이벤트 기록
<!-- Root Logger -->
<!-- root : 모든 클래스에서 발생되는 로그 이벤트를 기록하기 위한 엘리먼트 -->
<!-- => 모든 logger 엘리먼트는 root 엘리먼트의 정보를 상속받아 사용(override도 가능) -->
<root><!-- 모든 클래스에서 경고이상의 로그 이벤트가 발생되면 콘솔 어펜더 가지고 기록해줘! -->
<!-- priority : 모든 클래스에서 발생되는 기본 로그 이벤트를 설정하기 위한 엘리먼트 -->
<!-- value 속성 : 로그 이벤트를 속성값으로 설정 -->
<!-- => 속성값으로 설정된 로그 이벤트보다 상위의 이벤트가 발생된 경우 로그 구현체로 기록 -->
<priority value="warn" />
<!-- appender-ref : 로그 구현체 참조하기 위한 엘리먼트 -->
<!-- ref 속성 : appender 엘리먼트의 식별자를 속성값으로 설정 -->
<appender-ref ref="console" />
</root>
</log4j:configuration>
6) 로그 구현체의 설정으로 인해 콘솔에 아래처럼 찍히는 것임
반응형
'framework > spring' 카테고리의 다른 글
[spring] 6. Spring 프로젝트 파일명의 종류 | 라이브러리 | maven빌드툴 | 버전변경 | context루트경로변경 (with Eclipse) (0) | 2024.07.25 |
---|---|
[spring] 5. 메이븐 라이브러리 환경설정파일 pom.xml (0) | 2024.07.24 |
[spring] 4. sts 설치법 | spring으로 perspective 변경법 | spring 프로젝트 생성법 (feat. Eclipse) (1) | 2024.07.24 |
[spring] 2. Lombok 라이브러리 빌드 및 사용법 (2) | 2024.07.23 |
[spring] 1. spring의 기초개념 (0) | 2024.07.06 |