본문 바로가기
Spring

log4j2

by 요리하다그만둠 2022. 7. 27.

1. pom.xml

legacy project 에서는 기본적으로 slf4j & log4j 1.2.x 를 위주로 로깅(logging) 시스템이 구성되어 있습니다. 그러나 log4j 1.2.x 가 단종되고 자연스럽게 log4j2로 이관되면서 로깅 시스템도 log4j2로 재편되었습니다. 그러므로 아래와 같이 log4j 1.2.x에 관한 라이브러리 의존성(dependecy) 정보를 배제시키고 그 대신 log4j2 와 slf4j로 구성된 로깅 시스템을 구성할 수 있습니다. 게다가 log4jdbc 라는 DB 전문 로깅 시스템도 덧붙여서 구성할 수 있습니다. 다만 사용시 옵션을 잘못 사용하면 로깅 정보가 "폭발적으로" 증가할 수 있으므로 옵션 정보를 잘 조정하여 시스템에 맞는 정보를 구성하면 되겠습니다.

<!-- Logging -->
		
		<!-- Slf4J -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		
		<!-- log4j2 -->
		<dependency>
		    <groupId>org.apache.logging.log4j</groupId>
		    <artifactId>log4j-core</artifactId>
		    <version>2.17.1</version>
		</dependency>
		
		<dependency>
		    <groupId>org.apache.logging.log4j</groupId>
		    <artifactId>log4j-api</artifactId>
            <version>2.17.1</version>
	    </dependency>
		
		<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl -->
		<dependency>
		    <groupId>org.apache.logging.log4j</groupId>
		    <artifactId>log4j-slf4j-impl</artifactId>
		    <version>2.17.1</version>
		</dependency>
		
		<!-- 
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${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>
		-->

2. log4j2 : log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">

	<!-- 
	
	######## log4j pattern(패턴) ##########
	 
	%p : 로그 레벨(debug, info, warn, error, fatal)의 priority(디버깅시 출력 우선권)가 출력됨.
	%m : 로그 내용이 출력.
	%d : 로그 이벤트가 발생한 시간을 기록.
	  ex) %d{HH:mm:ss, SSS}, %d{yyyy MMM dd HH:mm:ss, SSS}
	  : Java의 SimpleDateFormat의 클래스에 따른 포맷(format) 적용
	  
		- %d{ABSOLUTE}
		- %d{DATE}
		- %d{ISO8601}

	%t : 로그 이벤트가 발생된 스레드(thread)명을 출력.
	%% : % 표시 출력.
	%n : 플랫폼 종속적인 개행문자(줄바꿈)가 출력.
	%c : 카테고리(category)를 표시.
	 ex) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c가 출력.
	 
	%C : 클래스명(class)을 표시. 
	 ex) 만약 클래스의 패키지 구조가 com.javateam.project.DemoClass 라고 한다면  
	     %C{2}는 project.DemoClass 가 출력됨.
	 
	%F : 로그가 발생한 프로그램 파일(File)명.
	%l : 로그가 발생한 호출자(caller)의 정보.
	%L : 로그가 발생한 호출자(caller)의 라인수(line)를 나타냅니다
	%M : 로그가 발생한 메서드(method) 이름을 나타냅니다.
	%r : 프로그램 시작 이후 부터 로그가 발생한 시점의 시간(milliseconds : 밀리초)
	%x : 로그가 발생한 스레드(thread)와 관련된 NDC(nested diagnostic context)를 출력.
	%X : 로그가 발생한 스레드(thread)와 관련된 MDC(mapped diagnostic context)를 출력. %X{key} 형태.
	
	참고) NDC & MDC : https://cwiki.apache.org/confluence/display/LOGGINGLOG4J/NDCvsMDC
	http://egloos.zum.com/charmpa/v/2543451
	
	- 공백(whitespace) 패딩 관련
	%5p : 우측 정렬로 로그 레벨을 남김. 로그 레벨이 5글자가 안되면 왼쪽에 공백을 추가하여 5글자 맞춤.
	%-5p : 좌측 정렬. 

	-->
	
	<Properties>
	
		<!-- <Property name="LOG_PATH" value="E:\lsh\log\spring\test" /> -->
		<Property name="LOG_PATH" value="로그 경로" />
		
		<Property name="layoutPattern">
			%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%C] [%t] -- %m%n
		</Property>
	</Properties>
	
	<Appenders>
	
		<Console name="ConsoleAppender" target="SYSTEM_OUT">
			<PatternLayout pattern="${layoutPattern}" />
		</Console>
		
		<RollingFile name="FileAppender" 
		 			 fileName="${LOG_PATH}/log4j2_test.log" 
		 			 filePattern="${LOG_PATH}/log4j2_test_%d{yyyy-MM-dd}_%i.log">
		 			  
            <PatternLayout pattern="${layoutPattern}"/>
            
            <Policies>
                <SizeBasedTriggeringPolicy size="50KB"/>
                <TimeBasedTriggeringPolicy interval="1"/>
            </Policies>
            
            <DefaultRolloverStrategy max="10" fileIndex="min"/>
            
        </RollingFile>
        
	</Appenders>
	
		
	<Loggers>
	
		<Logger name="com.javateam.프로젝트 contextPath.test" 
				level="INFO" 
				additivity="false">
			<AppenderRef ref="ConsoleAppender"/> 
			<AppenderRef ref="FileAppender"/>
		</Logger>
				
		<Root level="INFO" additivity="false">
			<AppenderRef ref="ConsoleAppender" />
			<AppenderRef ref="FileAppender"/>
		</Root>
		
	</Loggers>
	
</Configuration>
 

중요) log4J 보안

문제 관련 기사들 :

- https://www.itworld.co.kr/news/219729

- https://www.itworld.co.kr/news/219499

- https://www.itworld.co.kr/news/219809

기존의 log4j.xml 파일이 있다면 그것을 삭제하고 아래와 같이 파일을 새로 생성하여 구성합니다.

- site : https://logging.apache.org/log4j/log4j-2.17.1/manual/configuration.html

- 추천 링크) https://velog.io/@bread_dd/Log4j-2-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

'Spring' 카테고리의 다른 글

List 타입 매핑  (0) 2022.08.05
AOP 01  (0) 2022.07.29
제어의 역행(역전) : IoC(DI)  (0) 2022.07.25
STS IoC컨테이너  (0) 2022.07.25
프레임워크 개념  (0) 2022.07.25