서비스를 운영하는데에는 모니터링이 정말 중요합니다.
오늘은 Log4j2를 사용해 로그를 남기는 방법에 대해 알아보겠습니다.
전체 코드는 https://github.com/DevDotUng/Log4j2 에서 확인할 수 있습니다.
GitHub - DevDotUng/Log4j2
Contribute to DevDotUng/Log4j2 development by creating an account on GitHub.
github.com
1. 왜 Log4j2인가?
Spring 로깅 구현체는 Logback, Log4j, Log4j2 등 여러가지가 있지만 Log4j2를 사용하는 이유는 성능일 것입니다.


위 사진들과 같이 동일 쓰레드 기준 동기, 비동기 처리 속도 모두 Log4j2가 월등히 빠릅니다.
참고: https://logging.apache.org/log4j/2.x/performance.html
Log4j – Performance
Performance Apart from functional requirements, an important reason for selecting a logging library is often how well it fulfills non-functional requirements like reliability and performance. This page compares the performance of a number of logging framew
logging.apache.org
2. 의존성 추가
Log4j2를 s 위해 build.gradle을 설정해줍니다.
implementation 'org.springframework.boot:spring-boot-starter-log4j2'
spring의 기본 로깅 모듈 Logback과의 충돌을 피하기 위해 다음과 같이 의존성 제거를 해줍니다.
configurations {
all {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
}
3. Log4j2 설정
resources/log4j2.xml을 만들어줍니다.
- log4j2.xml
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="INFO">
<Properties>
<Property name="LOG_DATEFORMAT_PATTERN">{yyyy-MM-dd HH:mm:ss.SSS}</Property>
<Property name="LOG_LEVEL_PATTERN">{-%5p}{FATAL=red blink, ERROR=red, WARN=yellow bold, INFO=green, DEBUG=green bold, TRACE=blue} %style{${sys:PID}}{magenta} [%15.15t] %style{%-40.40C{1.}}{cyan} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}</Property>
</Properties>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT">
<PatternLayout disableAnsi="false" pattern="%d${LOG_DATEFORMAT_PATTERN} %highlight${LOG_LEVEL_PATTERN}"/>
</Console>
<RollingFile name="FileAppender"
fileName="logs/spring.log"
filePattern="logs/spring-%d{yyyy-MM-dd}-%i.log">
<JsonLayout complete="false" compact="false" charset="UTF-8">
<KeyValuePair key="service" value="simple" />
</JsonLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="10000KB" />
</Policies>
<DefaultRolloverStrategy max="20" fileIndex="min" />
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="ConsoleAppender" />
<AppenderRef ref="FileAppender" />
</Root>
</Loggers>
</Configuration>
아무 설정이 없으면 resources/log4j2.xml이 디폴트지만 application.properties 설정을 통해 폴더 위치를 바꿀 수 있습니다.
logging.config=classpath:log4j2/log4j2.xml
저는 application.properties 파일에 위 코드를 추가하여 resources/log4j2 폴더에 파일을 추가하였습니다.
Properties
해당 설정파일에서 사용할 프로퍼티
Appenders
로그를 출력할 대상을 설정
- Console: 콘솔에 출력될 로그를 설정
- RollingFile: 파일로 저장될 로그 설정
- name: appender 이름
- fileName: 저장될 파일 경로와 이름 (위와 같이 할 경우 {프로젝트 폴더}/logs/spring.log와 같이 저장된다.)
- filePattern: 롤링 정책에 따른 파일 이름 패턴
- Policies: 정책
- TimeBasedTriggeringPolicy: interval (1 당 1일) 단위로 새로운 파일에 기록
- SizeBasedTriggeringPolicy: 파일 사이즈가 설정 용량을 초과할 경우 새로운 파일에 기록
- DefaultRolloverStrategy: 파일 생성 최대 개수
4. Controller 구현
실행만 해도 로그가 출력되지만 Controller를 만들어 에러 로그도 출력해보겠습니다.
- Log4j2Controller.java
package com.log4j2.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/log4j2")
public class Log4j2Controller {
@GetMapping("")
public void log4j2() {
int n = 1/0;
}
}
5. 결과

log 파일이 잘 생성되었습니다.
- spring.log


로그가 json로 잘 저장된 것을 확인할 수 있습니다.
전체 코드: https://github.com/DevDotUng/Log4j2
GitHub - DevDotUng/Log4j2
Contribute to DevDotUng/Log4j2 development by creating an account on GitHub.
github.com
'Spring' 카테고리의 다른 글
| [SpringBoot + AWS] S3를 이용한 이미지 업로드 구현 (0) | 2025.01.03 |
|---|---|
| [SpringBoot] Gradle 프로젝트 Jar 빌드 및 실행 (Terminal, MacOS, Linux) (0) | 2024.02.26 |
| [SpringBoot] Thymeleaf란? 기본 문법과 사용법 (0) | 2023.11.29 |
| [SpringBoot] POI 를 사용하여 엑셀(.xlsx) 파일 내의 이미지 추출 (0) | 2023.11.21 |
| [SpringBoot] POI 를 사용하여 엑셀(.xlsx) 파일 읽기 (0) | 2023.11.14 |