framework/spring mvc 웹사이트제작법

[springMVC웹] 8. 로그구현체 환경설정파일 - log4j.xml & log4jdbc.log4j2.properties

jeri 2024. 8. 5. 14:36
반응형
🌈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
반응형