Spring/Spring 실습

Spring log4j 적용하기

기발개발 2022. 3. 31. 18:33

일단 spring 프로젝트를 만들면 기본적으로 log4j에 관한 lib는 추가되어있다.

pom.xml

<!-- Test -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.7</version>
    <scope>test</scope>
</dependency>

<!-- Logging -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${org.slf4j-version}</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>${org.slf4j-version}</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>${org.slf4j-version}</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.15</version>
    <exclusions>
        <exclusion>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
        </exclusion>
        <exclusion>
            <groupId>javax.jms</groupId>
            <artifactId>jms</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.sun.jdmk</groupId>
            <artifactId>jmxtools</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.sun.jmx</groupId>
            <artifactId>jmxri</artifactId>
        </exclusion>
    </exclusions>
    <scope>runtime</scope>
</dependency>

 

 

 

 

spring 프로젝트의 Java Resource를 보면 src/main 과     src/test가 있다.

이 중 test는 실제 배포할 때는 배포되지않는다. 단순히 test용도로 쓰이는 폴더다. 

log4j의 설정파일 log4j.xml은 기본적을 src/main/resources, src/test/resources에

각각 있는데  test폴더의 log4j.xml파일이 우선순위가 더 높다. 

원할한 실습을 위해선 test의 log4j.xml은 삭제해주자.

 

그리고 log4j.xml의 DOCTYPE을 다음과 같이 변경하자.

<?xml version="1.0" encoding="UTF-8"?>
<!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에서 사용하는 태그들은 다음과 같다.

태그 설명
<appender> 로그의 출력 위치(파일, 콘솔, DB등)를 결정합니다.
<layout> appender가 어디에 출력할 것인지에 대한 태그였다면
layout은 어떤 형식으로 로그를 출력할지 정해줍니다.
<appender> 태그 내부에 작성합니다.
<logger> 로깅 메시지를 appender에 전달합니다. logger는 6단계의 레벨을 가지며, 레벨을 가지고 출력여부를 결정합니다.
<root> <logger>에 따로 appender를 지정하지 않았을 때   기본적으로 적용될 appender 지정

 

 

<appender>

appender 클래스 설명
ConsoleAppender org.apache.log4j.ConsoleAppender 클래스로, 콘솔에 로그 메시지를 출력합니다.
FileAppender org.apache.log4j.FileAppender 클래스로, 파일에 로그 메시지를 출력합니다.
RollingFileAppender org.apache.log4j.rolling.RollingFileAppender 클래스로, 파일 크기가 일정 기준을 넘으면
기존 파일을 백업 파일로 바꾸로 처음부터 로그를 기록합니다.
DailyRollingAppender org.apache.log4j.rolling.DailyRollingFileAppender 클래스로,
설정한 기간 단위로 새 파일을 만들어 로그 메시지를 기록합니다.

 

<layout>

속성 설명
%p debug, info 등 로그 레벨 이름 출력
%m 로그 메시지 출력
%d 로깅 이벤트 발생 시각 출력 (yyyy-MM-dd HH:mm:ss)
%c 로깅 메시지 앞에 전체 패키지 이름이나 전체 파일 이름 출력

 

<logger>

레벨 설명
FATAL(6레벨) 시스템 차원에서 심각한 문제가 발생했을 때의 레벨입니다.
ERROR 실행 중 문제가 발생한 상태를 나타냅니다.
WARN 시스템 오류의 원인이 될 수 있는 메시지를 나타냅니다.
INFO 로그인, 상태 변경과 같은 실제 애플리케이션 운영과 관련된 정보를 출력합니다.
DEBUG 개발 시 디버깅 용도로 사용한 메시지를 나타냅니다.
TRACE(1단계) DEBUG보다 상세한 로깅 정보를 출력합니다.

 

 

 

 

log4j.xml을 보면 기본적으로 다음과 같이 되어있다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

<!-- 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>

<!-- Application Loggers -->
<logger name="com.study.home">
    <level value="info" />
</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>

<!-- Root Logger -->
<root>
    <priority value="warn" />
    <appender-ref ref="console" />
</root>

</log4j:configuration>

org.springfamework 관련해서 logger가 있고

root 폴더에 기본적으로 "console" appender가 적용되어있다. 

그래서 서버를 키면 다음과 같은 로그가 찍힌다

 

 

 

 

 

 

이번 실습에서는 자세한 설명보다는 com.study에서 일어나는 일들에 대해서 

콘솔과 파일에 찍히도록 작성해보았다. 

 

 

log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!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/">
	
	<!-- 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>
	
	
	<appender name="fileLogger"
		class="org.apache.log4j.DailyRollingFileAppender">
		<param name="file"
			value="C:\\workspace\\logs\\spring\\spring.log"/>   <!-- /home/ssam/log/spring.log -->     
		<param name="Append" value="true" />
		<param name="DatePattern" value=".yyyy-MM-dd" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" 
				value="[%d{yyyy-MM-dd HH:mm:ss}] %-5p: %F:%L - %m%n" /> 
		</layout>
	</appender>
	
	<!-- Application Loggers  : 로그 찍을 위치-->
	<!-- ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
	 	debug로 레벨설정하면  debug,info,warn 다 로그찍힘
	 	info로 설정하면 info, warn 다 로그찍힘
	   mybatis쿼리는 기본적으로 debug로 되어있음  -->
	<!-- Application Loggers ,  파일도 찍히고 콘솔도 찍힌다. -->
	<logger name="com.study" additivity="false">  
		<level value="debug"></level> 
		<appender-ref ref="fileLogger" />
		<appender-ref ref="console" />
	</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>

	<!-- Root Logger -->
	<root>
		<priority value="warn" />
		<appender-ref ref="console" />
	</root>
	
</log4j:configuration>

 

 

 

이제 FreeBoardController에 다음과 같이 log를 출력하는 코드를 작성하자. 

FreeBoardController.java

	private Logger logger= LoggerFactory.getLogger(this.getClass());

	@RequestMapping("/free/freeList.wow")
	public String freeList(Model model, @ModelAttribute("searchVO") FreeBoardSearchVO searchVO) {
		logger.info("searchVO : {}" , searchVO);  //이게 추가되었다
		List<FreeBoardVO> freeBoardList = freeBoardService.getBoardList(searchVO);
		model.addAttribute("freeBoardList", freeBoardList);
		return "free/freeList";
	}

"/free/freeList..wow"로 요청하였을 때 searchVO가 log로 출력될것이다. 

또한 mybatis를 통해 freeBoardList를 얻을텐데 log4j.xml설정에서 level을

DEBUG로 설정했기 때문에 mybatis관련 로그도 콘솔에 보일 것이다. 

 또 FileAppender에 의해 파일로도 로그가 찍힐 것이다.

 

 

 

"/free/freeList..wow" 요청 했을 때 콘솔에 로그가 찍힌다.

 

 

또 위와 같은 내용이 파일로도 생성된다.