반응형
🌈log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- log4.xml : 로그 구현체에 대한 환경설정 파일 -->
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "<http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd>">
<log4j:configuration xmlns:log4j="<http://jakarta.apache.org/log4j/>">
- <appender> : console어펜더
<!-- Appenders -->
<!-- appender : 로그 구현체를 구성하는 클래스를 설정하기 위한 엘리먼트 -->
<!-- name 속성 : appender 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정 -->
<!-- class 속성 : 로그 구현체로 사용하기 위한 클래스를 속성값으로 설정 -->
<!-- => class 속성값으로 설정된 클래스는 반드시 Appender 인터페이스를 상속받아 작성 -->
<!-- => class 속성값으로 설정된 클래스에 따라 로깅정보를 기록하는 방식이 다르게 설정 -->
<!-- => 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} : 패키지를 제외한 클래스의 이름만 기록 -->
<!-- %d : 날짜와 시간을 기록 - {SimpleDateFormat}을 이용하여 원하는 형식으로 기록 -->
<!-- => %d{yyyy-MM-dd} : [년-월-일] 형식으로 로그시간 기록 -->
<!-- %m : 로그 이벤트에 의해 생성된 로그 메세지를 기록 -->
<!-- %n : 엔터(Enter)를 기록 - 로그 줄바꿈 -->
<!-- %M : 로그 이벤트가 발생된 메소드의 이름을 기록 -->
<!-- %p : 로그 메세지가 발생된 로그 이벤트를 기록 -->
<!-- => 로그 이벤트 : TRACE > DEBUG > INFO > WARN > ERROR > FATAL -->
<!-- # 변환문자 자릿수 설정 - %p 변환문자를 이용하여 예제 설정 -->
<!-- %p : 로그 이벤트의 길이만큼 자릿수를 제공받아 기록 -->
<!-- %5p : 로그 이벤트를 5자리(최대 자릿수)를 제공받아 기록 - 오른쪽 정렬 -->
<!-- => 자릿수가 부족하면 기록이 잘리고 남으면 공백으로 처리되어 기록 -->
<!-- %-5p : 로그 이벤트를 5자리(최대 자릿수)를 제공받아 기록 - 왼쪽 정렬 -->
<!-- %.5p : 로그 이벤트를 5자리(최소 자릿수)를 제공받아 기록 - 오른쪽 정렬 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
</layout>
</appender>
- <appender> : sample어펜더
<!-- sample : 클래스마다 다른 메소드가 출력해주는 로그메세지를 콘솔에 기록하기 위한 어펜더 -->
<appender name="sample" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%c{1} 클래스의 %M 메소드 - %m%n" />
</layout>
</appender>
- <appender> : dailyLogFile어펜더
<!-- dailyLogFile: 매일 파일에 새로운 기록을 남기는 어펜더 -->
<!-- => 실행 후 기록이 잘 되었는지는 spring프로젝트에 커서두고 [F5] 눌러서 확인하기 -->
<appender name="dailyLogFile" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="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>
- <logger> : 특정 패키지의 클래스 내 발생되는 로그이벤트 기록
<!-- Application Loggers -->
<!-- logger : 특정 패키지의 클래스에서 발생되는 로그 이벤트를 기록하기 위한 엘리먼트 -->
<!-- name 속성 : 패키지 경로를 속성값으로 설정 -->
<logger name="xyz.itwill10.controller">
<!-- level : 패키지에 작성된 클래스에서 발생되는 로그 이벤트를 설정하기 위한 엘리먼트 -->
<level value="info" />
</logger>
<!-- additivity 속성 : false 또는 true(기본) 중 하나를 속성값으로 설정 -->
<!-- => 속성값이 [false]인 경우 root 엘리먼트의 로그 구현체(Appender)를 포함하지 않도록
동작되고 [true]인 경우 root 엘리먼트의 로그 구현체(Appender)를 포함되도록 동작 -->
<logger name="xyz.itwill00.log" additivity="false">
<level value="info"/>
<appender-ref ref="sample" />
<appender-ref ref="dailyLogFile" />
</logger>
<!-- 3rdparty Loggers -->
<logger name="org.springframework.core">
<level value="info" />
</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>
- 스파이 프로그램 : 마이바티스의 로그 이벤트를 스프링의 로그구현체가 구현하기 위해 추가
<!-- SpyLogDelegator 객체에 의해 전달된 로그 이벤트를 기록하기 위한 logger 엘리먼트 -->
<!-- jdbc.sqlonly : 완성된 SQL 명령 기록 -->
<logger name="jdbc.sqlonly">
<level value="info" />
</logger>
<!-- jdbc.sqltiming : SQL 명령의 실행시간(ms) 기록 -->
<logger name="jdbc.sqltiming">
<level value="info" />
</logger>
<!-- jdbc.audit : ResultSet 관련 매핑 정보를 제외한 모든 JDBC 관련 정보 기록 -->
<logger name="jdbc.audit">
<level value="info" />
</logger>
<!-- jdbc.resultset : ResultSet 관련 매핑 정보를 포함한 모든 JDBC 관련 정보 기록 -->
<!--
<logger name="jdbc.resultset">
<level value="info" />
</logger>
-->
<!-- jdbc.resultsettable : ResultSet 관련 매핑 정보를 표(Table)형식으로 기록 -->
<logger name="jdbc.resultsettable">
<level value="info" />
</logger>
<!-- jdbc.connection : Connection 객체 관련 정보 기록 - Open 또는 Close -->
<logger name="jdbc.connection">
<level value="info" />
</logger>
- <root> : 모든 클래스 내 발생되는 로그이벤트 기록
<!-- Root Logger -->
<!-- root : 모든 클래스에서 발생되는 로그 이벤트를 기록하기 위한 엘리먼트 -->
<!-- => 모든 logger 엘리먼트는 root 엘리먼트의 정보를 상속받아 사용 -->
<root>
<!-- priority : 모든 클래스에서 발생되는 기본 로그 이벤트를 설정하기 위한 엘리먼트 -->
<!-- value 속성 : 로그 이벤트를 속성값으로 설정 -->
<!-- => 속성값으로 설정된 로그 이벤트보다 상위의 이벤트가 발생된 경우 로그 구현체로 기록 -->
<priority value="warn" />
<!-- appender-ref : 로그 구현체를 참조하기 위한 엘리먼트 -->
<!-- ref 속성 : appender 엘리먼트의 식별자를 속성값으로 설정 -->
<appender-ref ref="console" />
</root>
</log4j:configuration>
🌈log4jdbc.log4j2.properties
- 로깅정보를 가져다 기록하는 대리인이 누구??? => log4jdbc.spylogdelegator.name
log4jdbc.spylogdelegator.name = net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
01. mybatis 프레임워크 로그 이밴트를 spring 프레임워크 로그 구현체에 기록하기
- 퍼시스턴스 프레임워크(Persistence Framework)에 의해 발생되는 로그 이벤트를
- Spring Framework의 로그 구현체로 기록하기 위한 기능을 제공하는 라이브러리를 빌드처리 했기 때문에
- 즉, DAO 메소드를 호출할 때 사용하는 mybatis 프레임워크에 대한 로그 이벤트를 Spring 프레임워크의 로그 구현체로 기록하고 싶어서 추가한 것임
①클라가 /student/display 요청 시
②StudentController클래스의 display 요청 처리 메소드가 동작 될 것이며 내부 코드를 분석해보면 다음과 같음
//StudentController클래스의 display()
@RequestMapping("/display")
public String display(Model model) {
model.addAttribute("studentList",studentService.getStudentList());
return "student/student_display";
}
//studentService.getStudentList()
@Override
public List<Student> getStudentList() {
return studentDAO.selectStudentList();
}
//studentDAO.selectStudentList()
@Override
public List<Student> selectStudentList() {
return sqlSession.getMapper(StudentMapper.class).selectStudentList();
}
<!-- 매퍼바인딩된 XML 파일 -->
<select id="selectStudentList" resultType="Student">
select * from student order by no
</select>
③그리하여 콘솔에 기록된 로그 내용은...?
- 로깅 정보 해석 tip
- audit - 1은 숫자가 증가함 audit - 2 → audit - 3
- select 은 resultSet 테이블로 출력됨
- execute() retruned true → select
- execute() retruned false → update, insert, delete
반응형