애플리케이션의 로그는 개발 중에는 디버깅을 위해서 주로 사용되지만, 애플리케이션이 배포된 후에는 애플리케이션의 상태를 모니터링하기 위한 용도로 사용됩니다. 서버에 애플리케이션을 배포하고 나면 개발자는 개발 툴(STS, IntelliJ 등)에서 로그를 확인 할 수 없기 때문에 로그를 다른 방법으로 관리해야 합니다.(물론 서버 터미널에 찍히는 로그를 볼 수는 있으나, 하루 종일 24시간 보고 있을 수는 없겠죠~. 그래서 파일 또는 DB에 저장하는 방법을 사용합니다.)
spring에서는 로그를 관리하기 위해서 Log4j, Logback, 그리고 Log4j2를 이용할 수 있는데요, Log4j는 요즘 거의 사용하지 않으며 Logback 또는 Log4j2를 대부분 사용합니다.
※ Log4j 보다 Logback이 우수하고, Logback보다 Log4j2이 성능면에서 우수합니다. (Log4j > Logback > Log4j2)
이번 시간에는 spring boot app에 Log4j2를 적용해서 로그를 관리하는 방법에 대해서 살펴보겠습니다.
1. 샘플 프로젝트 생성
프로젝트 Name, Group, Artifact, Package를 입력하고 'Next'를 누릅니다.
Log4j2 사용방법을 위한 간단한 프로젝트를 만들기 위해서 필요한 모듈만 최소한으로 가져옵니다.
2. Logback 해제하고 Log4j2 적용 하기
spring boot는 기본적으로 'Logback'을 사용합니다. 따라서 'Logback'을 해제하고 'Log4j2' 모듈을 사용하도록 설정합니다.
build.gradle 파일을 열어서 'Logback'을 해제합니다.
configurations {
compileOnly {
extendsFrom annotationProcessor
}
all {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
}
'Logback'을 해제했다면, 'Log4j2' 모듈을 추가합니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
// Log4j2
implementation 'org.springframework.boot:spring-boot-starter-log4j2'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
'Log4j2' 모듈을 적용하기 위해서 그래들을 Refresh 합니다.(Refresh Gradle Project)
src/main/resurces에 'logger' 디렉터리를 만들고 'log4j2-local.xml' 파일을 만듭니다.
'log4j2-local.xml' 파일은 log4j2 설정 파일로 아래와 같이 코딩합니다.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<!-- 로그 패턴 설정 -->
<Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} %-5p [%c{1}] - %m%n</Property>
</Properties>
<Appenders>
<!-- 콘솔 출력 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
</Appenders>
<Loggers>
<!-- 기본 로거 설정 -->
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
<Property name="LOG_PATTERN">: 로그가 출력되는 패턴(모양)을 설정합니다.
- %d{yyyy-MM-dd HH:mm:ss}: 날짜와 시간 출력 패턴(예. 2024-12-25 14:30:15)
- %-5p:
- 로그 레벨로 심각도 수준(예: INFO, DEBUG, ERROR)에 대한 출력 패턴
- '-5'는 로그 레벨을 최소 5칸의 폭으로 맞추는 포맷
- %c{1}: 로거 이름으로 로그를 생성한 클래스나 패키지 이름 출력 패턴
- %m: 로그 메시지로 실제 로그 메시지 출력
- %n: 줄바꿈
<Appenders>: 로그가 출력되는 대상을 설정합니다.(예. 콘솔(<Console>), 파일(<File>) 등)
<Loggers>: 로그가 적용되는 대상을 설정합니다.(예. 특정 패키지, 루트(<Root>))
application.properties에서 log4j2 설정 파일을 인식할 수 있도록 설정합니다.
spring.application.name=loggerpjt
# Tomcat
server.port=8090
# Dev Tools
spring.devtools.restart.enabled=true
# Thymeleaf
spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.check-template-location=true
# log4j2
logging.config=classpath:logger/log4j2-local.xml
여기까지 진행했다면 log4j2를 사용하기 위한 기본 설정이 완료됐습니다.
지금까지의 내용을 요약하면 애플리케이션은 'log4j2-local.xml'의 설정에 따라서 콘솔에 로그를 출력합니다.
3. Log4j2을 이용한 로그 출력
실제로 콘솔에 로그를 출력해 보기위해서 컨트롤러(HomeController.java)와 뷰(home.html)를 만들고 다음과 같이 코딩합니다.
HomeController.java를 만들고 다음과 같이 코딩합니다.
package com.office.loggerex;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class HomeController {
@GetMapping({"", "/"})
public String home() {
log.debug("debug - home()");
log.info("info - home()");
log.warn("warn - home()");
log.error("error - home()");
return "home";
}
}
log4j2를 이용해서 로그를 출력하기 위해서는 @Slf4j 어노테이션을 이용합니다.
※ 참고. log4j2는 slf4j 인터페이스를 구현한 구현체입니다. 만약 log4j2를 사용하고 싶다면 lombok 패키지에 있는 @Log4j2 어노테이션을 사용해도 됩니다.
package com.office.loggerex;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import lombok.extern.log4j.Log4j2;
//@Slf4j
@Log4j2
@Controller
public class HomeController {
.. 생략
home.html을 만들고 다음과 같이 코딩합니다.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>log4j2 ex</title>
</head>
<body>
This page is HOME.
</body>
</html>
프로젝트를 실행하고 Console 창에 출력되는 로그를 확인합니다.
콘솔창에 출력된 로그를 보면 'log4j2-local.xml' 파일의 설정에 맞춰서 출력된 것을 확인할 수 있습니다.
<!-- 로그 패턴 설정 -->
<Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} %-5p [%c{1}] - %m%n</Property>
HomeController의 로그도 확인해 보기 위해서 브라우저에서 접속해 보겠습니다.
'log4j2-local.xml' 파일에서 설정 패턴에 맞춰서 'HomeController'의 'home()'의 로그가 출력된 것을 확인할 수 있습니다.
※ 참고. debug 로그가 출력되지 않은 이유는 'log4j2-local.xml'에서 로그 레벨을 'info' 설정했기 때문입니다. 로그 레벨을 'info'로 설정하면 'info' 이상의 로그만 출력합니다. 호기심이 발동한다면 level="info"를 level="debug"로 변경해보세요. 그동안 여러분이 경험하지 못했던 꽤 많은 로그들이 출력되는 새로운 경험을 하게 될 것입니다.
<Loggers>
<!-- 기본 로거 설정 -->
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
이번 시간에는 log4j2를 사용하기 위한 기본 내용에 대해서 살펴봤습니다. 다음 시간에는 로그를 콘솔 외에 파일로 저장하는 방법에 대해서 살펴보겠습니다.
'spring boot' 카테고리의 다른 글
Log4j2를 이용한 로깅(logging) 방법 - III (2) | 2024.12.11 |
---|---|
Log4j2를 이용한 로깅(logging) 방법 - II (3) | 2024.12.11 |
spring boot app을 로컬, 개발 서버, 실행(배포) 서버로 구분해서 실행하기 - II (2) | 2024.11.22 |
spring boot app을 로컬, 개발 서버, 실행(배포) 서버로 구분해서 실행하기 - I (1) | 2024.11.22 |
Docker를 이용한 spring boot app 배포하기 (1) | 2024.11.21 |