catalina.out 사이즈가 기하급수적으로 늘어나면서 로그 관리의 필요성을 느끼게 되었다. 

 

해결방안은 여러가지인데 처리한 과정들을 적어본다.

아래는 로그 관리 관련된 부분들이다.

 

◾ log4j2

 catalina.sh

 logrotate

 logging.properties


 

 

✔ log4j2

 

◾ 변경 파일 : log4j2.xml 

 

현재 로그관리로 log4j2 를 사용하고 있다.

별도로 분리하여 보고 싶은 로그들이 있다. 예를 들어 scheduler로 돌아가는 로그라던지 CRUD 관련된 로그라던지 ... 

현재 서비스에서는 너무 많은 로그들이 catalina.out에 모두 쌓이고 있어서 확인이 너무 어려웠기 때문에 분리 하기로 했다.

 

1. logEvent 를 전달해주는 <Appenders> 에서는 layout 을 통해 로그의 포맷을 설정하고, 로그 제공 방식을 결정한다.

여러가지 제공 방식이 있는데 나는 Console 과 File 방식을 선택했다.

 

-

 

[ CRUD 로그 ]

 

<PatternLayout> 에서 출력할 패턴을 설정해주고 , <RegexFilter> 를 통해 정규식패턴을 이용하여 CRUD 부분을 찾아낸다.

<RegexFilter regex="(?s).*(?i)(insert|update|delete).*" onMatch="ACCEPT" onMismatch="DENY" /> 

 

날짜별로 쌓을 예정이기 때문에 <TimeBasedTriggeringPolicy /> 도 추가 해주었다.

 

그리고 <Loggers> 에서 log 정의를 설정한다. <Appenders> 에서 정의한 로그 제공방식을 선언한다고 보면 될듯? 

그리고 로그 레벨도 설정해준다.

<Logger name="jdbc.sqlonly" level="INFO" additivity="false">
	<AppenderRef ref="ExecLogFile" />
</Logger>

이렇게 하면 설정한 filePattern 에 따라 날짜별로 로그가 쌓인다. 

 

-

 

[ 스케줄러 로그 ]

 

스케줄러 sql Mapper 쿼리에는 /* cron.*** */ 와 같이 주석이 달려있다. 이부분을 활용하여 정규식 패턴으로 찍어보기로 했다.

<RegexFilter regex="(?s).*Cron.*" onMatch="ACCEPT" onMismatch="DENY" />

이렇게 설정해두고 실행했더니 쿼리로그만 쌓이고 컨트롤러에서 찍어둔 logger.info 는 어디에도 보이지 않았다. ㅠㅠ 

실행되는 start 지점을 깔끔하게 찍고 싶었는데 왜 자꾸 안되는지 이래저래 해보다가 결국 좀 더 세밀한 로그필터링을 진행해보았다.

 

<Loggers> 에서 log 정의를 설정한 부분은 아래와 같다. 특정 패키지를 name 에 지정하고 로그 레벨을 TRACE 로 지정했다.

<Logger name="springFramework.company.org.cron.extract" level="TRACE" additivity="false">
	<AppenderRef ref="ScheduledFile" />
</Logger>

그리고 위쪽 정규식 필터에서 onMatch 와 onMismatch 부분을 변경해주었다.

<RegexFilter regex="(?s).*Cron.*" onMatch="DENY" onMismatch="NEUTRAL" />

 

* 여기서 좀더 자세한 설명을 볼수 있는데 완벽한 이해가 아직 안되어서 좀더 공부해보아야 할듯...

happinessoncode.com/2018/07/04/Log4j2-Filter-onMatch-onMismatch-Action/

 

Log4j2 Filter의 onMatch, onMismatch 값들의 의미

Log4j2의 Filter를 사용하면 다양한 방법을 로그를 제어할 수 있다. Log4j2 - Filters 문서를 보면 Log4j2가 제공하는 필터의 종류와 설정 방법이 설명되어 있다. 필터 종류마다 설정해야 하는 속성들이 조

happinessoncode.com

 

그리고 컨트롤러에서 아래와 같이 로그 trace 레벨로 출력했다.

logger.trace("*****************************************************");
logger.trace("* START JOB");
logger.trace("* - Job Name : 일자별 DB 전환");
logger.trace("* - START time : " + formatTime(startTime));
logger.trace("* - date : " + yesterDay);

if(ScheduledYN.equals("Y")){
	logger.trace("스케줄러 고고");
}else{
	logger.trace("현재 스케줄러를 사용하지 않습니다.");
}

long endTime = System.currentTimeMillis();
logger.trace(result);
logger.trace("* - END time : " + formatTime(endTime));
logger.trace("*****************************************************");

원하는 경로에 파일을 생성하고 확인하고 싶은 부분만 로그를 찍었다 . 성공!

로그 예제

전체 (xml)

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
	<Appenders>
		<Console name="console" target="SYSTEM_OUT">
			<PatternLayout pattern="%d %5p [%c] %m%n" />
		</Console>

		<!-- 실행로그파일 별도 분리 -->
		<RollingFile name="ExecLogFile" fileName="${sys:catalina.base}/logs/sql/exec.log" filePattern="${sys:catalina.base}/logs/sql/exec_%d{yyyyMMdd}.log"> 
			<PatternLayout pattern="%d %5p [%c] %m%n"/>
			<RegexFilter regex="(?s).*(?i)(insert|update|delete).*" onMatch="ACCEPT" onMismatch="DENY" /> 
			<TimeBasedTriggeringPolicy /><!-- Rotated everyday --> 
		</RollingFile>
		
		<!-- 스케쥴러로그파일 분리 -->
		<RollingFile name="ScheduledFile" fileName="${sys:catalina.base}/logs/cron/cron.log" filePattern="${sys:catalina.base}/logs/cron/cron_%d{yyyyMMdd}.log"> 
			<PatternLayout pattern="%d %5p [%c] %m%n"/>
			<RegexFilter regex="(?s).*Cron.*" onMatch="DENY" onMismatch="NEUTRAL" />
			<TimeBasedTriggeringPolicy /><!-- Rotated everyday --> 
		</RollingFile>
	</Appenders>
	
	<Loggers>
		<!-- 스케쥴러로그파일 분리 -->
		<Logger name="springFramework.company.org.cron.extract" level="TRACE" additivity="false">
			<AppenderRef ref="ScheduledFile" />
		</Logger>
		
		<!-- 실행로그파일 별도 분리 -->
		<Logger name="jdbc.sqlonly" level="INFO" additivity="false">
			<AppenderRef ref="ExecLogFile" />
		</Logger>
		
		<Logger name="springFramework" level="DEBUG" additivity="false">
			<AppenderRef ref="console" />
		</Logger>

		<Logger name="jdbc.sqltiming" level="INFO" additivity="false">
			<AppenderRef ref="console" />
		</Logger>
				
		<Root level="ERROR">
			<AppenderRef ref="console" />
		</Root>
	</Loggers>
</Configuration>

 

catalina.sh 부분은 다음 포스팅에서 다뤄본다. 

 

 

[ 참고 ]

logging.apache.org/log4j/2.x/manual/configuration.html

 

Log4j – Configuring Log4j 2

Configuration Inserting log requests into the application code requires a fair amount of planning and effort. Observation shows that approximately 4 percent of code is dedicated to logging. Consequently, even moderately sized applications will have thousan

logging.apache.org

 

 

'WAS' 카테고리의 다른 글

[tomcat] 이미지 가상 디렉토리 설정  (0) 2021.04.27