카테고리 없음

로깅(Logging)

thespeace 2022. 2. 3. 19:46

현재까지 기록을 콘솔에다가 출력하게 하였다. ex) System out println("ex")

서버를 껐다 켜면 사라지게 되었는데, 조금 더 깊이 들어가 24시간 로그들을 기록하여 관리를 해보고자 한다.

그러기 위해 logging에 대해 알아보자.

 

[마이바티스]를 [스프링]에서 쓰기 위해서 중간다리 역할을 하는 [마이바티스 스프링]을porn.xml에 등록하여 사용하였었다.

로깅도 마찬가지로 slf4j를 중간 다리 역할로 써주면 된다.

[log4j]를 [스프링]에서 쓰기위해 [slf4j]를 중간 다리 역할로 써주면 된다.

loggerFactory를 이용하여 logger을 만들고 logging 하는 것이 목표이다.

 

porn.xml에 들어가서 [log4j]를 찾아서 버전을 최신버전으로 변경한다.(Maven repository에서 검색한 후 버전 확인)

본인은 1.2.17 버전으로 변경하였다.

<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>

 

다음으로 중간다리 역할을 하는 [slf4j]의 변수의 버전을 변경 해준다.

*alpha , beta는 사용하지 않고 일반 버전을 사용해야 한다.

본인은 1.7.30 버전으로 변경하였다.

<org.slf4j-version>1.7.30</org.slf4j-version>

 

현재까지 porn.xml에서 2가지 작업을 하여 본격 로깅을 할 준비를 하였다.

1. log4j 버전 변경

2. slf4j 버전 변경 (변수 값 변경)

 

다음으로 로그 관련 설정 파일 2개를 수정하여야 한다.

1. src/main/resources/log4j.xml

2. src/test/resources/log4j.xml

 

일단, test안의 log4j.xml을 살펴보았더니 빨간줄이 여러개.. 오류 발생.

dtd를 이렇게 변경하여 해결하였다. 이 오류에 대해서는 다음 글로 다뤄보자.

<!DOCTYPE log4j:configuration SYSTEM

     "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">

 

자 이제 준비는 마쳤고 테스트를 진행해보자.

src/test/java/TestClass.java

 

public class TestClass {

	@Test
	public void test() {
		
		Logger logger = LoggerFactory.getLogger(TestClass.class);
		
		System.out.println("test");
		
		logger.trace("trace");
		logger.debug("debug");
		logger.info("logger info");
		logger.warn("warn");
		logger.error("error");
		//로거를 왜 사용하는가? 실행의 문제가 있을 때 엔지니어 레벨에서 문제확인이 불가능 할 때,
		//개발자에게 넘어가게 되는데 협업 시 파일의 로그레벨을 확인하여 에러를 파악하기 위해 사용된다. 
	}
}

 

<Appender> 3가지

1.ConsoleAppender : 콘솔에 출력

2.FileAppender : 로그를 파일에 추가 저장

3.DailyRollingFileAppender : 날짜별로 파일에 추가 저장

 

<!-- Appenders -->
	<!-- Appender 설정 및 추가 -->
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy/MM/dd HH:mm:ss}] %-5p: %c - %m  %n" />
		</layout>
	</appender>
	<!-- 	 -5p : 음수는 왼쪽정렬,양수는 오른쪽 정렬 / 숫자는 글자수(5 = 무조건 5칸) / p : priority(우선순위 == 로그 레벨)
			   c : class
			%m%n : m == message / n == 개행(줄바꿈)
			  %d : date + {format설정} = %d{yyyy/MM/dd HH:mm:ss}
	-->
		
	<!-- File Appender xml-->
	<appender name="faxml" class="org.apache.log4j.FileAppender">
		<param name="file" value="myLogFile.xml" />
		<param name="append" value="true" /> <!-- append == 이어쓰기 -->
		<layout class="org.apache.log4j.xml.XMLLayout">
		</layout>
	</appender>
	
	<!-- File Appender txt-->
	<appender name="fatxt" class="org.apache.log4j.FileAppender">
		<param name="file" value="myLogFile.txt" />
		<param name="append" value="true" /> <!-- append == 이어쓰기 -->
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy/MM/dd HH:mm:ss}] %-5p: %c - %m  %n" />
		</layout>
	</appender>
	
	<!-- Daily Rolling File Appender txt-->
	<appender name="fatxtday" class="org.apache.log4j.DailyRollingFileAppender">
		<param name="file" value="D:/develop/logs/dailyLog.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: %c - %m  %n" />
		</layout>
	</appender>

 

작성한 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:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

	<!-- Appenders -->
	<!-- Appender 설정 및 추가 -->
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy/MM/dd HH:mm:ss}] %-5p: %c - %m  %n" />
		</layout>
	</appender>
	<!-- 	 -5p : 음수는 왼쪽정렬,양수는 오른쪽 정렬 / 숫자는 글자수(5 = 무조건 5칸) / p : priority(우선순위 == 로그 레벨)
			   c : class
			%m%n : m == message / n == 개행(줄바꿈)
			  %d : date + {format설정} = %d{yyyy/MM/dd HH:mm:ss}
		-->
		
	<!-- File Appender xml-->
	<appender name="faxml" class="org.apache.log4j.FileAppender">
		<param name="file" value="myLogFile.xml" />
		<param name="append" value="true" /> <!-- append == 이어쓰기 -->
		<layout class="org.apache.log4j.xml.XMLLayout">
		</layout>
	</appender>
	
	<!-- File Appender txt-->
	<appender name="fatxt" class="org.apache.log4j.FileAppender">
		<param name="file" value="myLogFile.txt" />
		<param name="append" value="true" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy/MM/dd HH:mm:ss}] %-5p: %c - %m  %n" />
		</layout>
	</appender>
	
	<!-- Daily Rolling File Appender txt-->
	<appender name="fatxtday" class="org.apache.log4j.DailyRollingFileAppender">
		<param name="file" value="D:/develop/logs/dailyLog.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: %c - %m  %n" />
		</layout>
	</appender>
	
	<!-- Application Loggers -->
	<!-- 설정된 level에 따라 로그 확인이 가능하다. 로거 설정 우선순위 1순위 -->
	<logger name="com.kh.app">
		<level value="debug" />
	</logger>
	
	<!-- Root Logger -->
	<!-- 전체 로거 레벨 설정, 로거 설정 우선순위 2순위 -->
	<root>
		<priority value="warn" />
		<appender-ref ref="fatxtday" />
		<appender-ref ref="console" />
	</root>
	
	<!-- 3rdparty Loggers -->
	<!-- 개별 세팅 가능하지만, Root Logger를 설정함으로서 전체 로거 레벨을 관리
	<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>
	 -->

</log4j:configuration>

 

Logger logger = LoggerFactory.getLogger(TestClass.class);

대신 Lombok의 어노테이션을 사용하여 간편하게 사용 가능하다.

@Slf4j // log 라는 이름의 변수에 로거를 담는다.
public class TestClass {

	@Test
	public void test() {
		
		//Logger logger = LoggerFactory.getLogger(TestClass.class);
		
		System.out.println("test");
		
		log.trace("trace");
		log.debug("debug");
		log.info("logger info");
		log.warn("warn");
		log.error("error");
	}
}