Spring Boot Log4j 설정

Yeeun_Kim·2024년 1월 26일
0
post-thumbnail

1. Log4j란

  • JAVA 기반의 Logging Utility로 Apache에서 만든 오픈소스 라이브러리이다.
  • 옵션 설정을 통해서 선택적으로 로그를 남길 수 있으며 특정 위치에 로그 파일 생성 또한 가능하다.

2. Log4j 사용 태그

1) appender

  • 로그의 출력위치를 결정(파일, 콘솔, DB등)한다.

ConsoleAppender

org.apache.log4j.ConsoleAppender 클래스, 콘솔에 로그 메시지를 출력한다.

FileAppender

org.apache.log4j.FileAppender 클래스, 파일에 로그 메시지 출력

RollingFileAppender

org.apache.log4j.rolling.RollingFileAppender 클래스, 파일 크기가 일정 기준을 넘을 경우 기존 파일을 백업 파일로 바꾸고 처음부터 로그를 기록한다.

DailyRollingAppender

org.apache.log4j.rolling.DailyRollingFileAppender 클래스, 설정한 기간 단위로 새파일을 만들어 로그 메시지를 기록한다.

2) layout

  • 어떤 형식으로 출력할 것인지 출력 Layout을 결정한다.

%p

debug, info 등 로그 레벨 이름 출력한다.

%m

로그메시지 출력한다.

%d

로깅 이벤트 발생시각 출력(yyyy-MM-dd HH:mm:ss)한다.

%c

로깅 메시지 앞에 전체 패키지 이름이나 전체 파일 이름 출력한다.

3) logger

  • 로깅 메시지를 appender에 전달한다. 6단계의 레벨을 가지며, 레벨을 가지고 출력여부를 결정한다.

FATAL

심각한 에러가 발생한 상태로 어플리케이션 작동이 불가능할 경우에 해당한다.

ERROR

요청을 처리하는 중 문제가 발생한 상태를 의미한다.

WARN

처리 가능한 문제지만 향후 시스템의 에러 원인이 될 수 있는 경고서 메시지를 의미한다.

INFO

로그인, 상태변경과 같은 정보성 메시지를 나타낸다.

DEGUG

개발시 디버그 용도로 사용한 메시지를 나타낸다.

TRACE

log4j1.2.12에서 신규 추가된 레벨로 DBUG레벨이 너무 광범위한 것을 해결하기 위해서 좀 더 상세한 상태를 나타낸다.

FATAL > ERROR > WARN > INFO > DEBUG > TRACE
DEBUG레벨 설정시 INFO~ FATAL까지 모두 logging 된다.

4) root

  • logger에게 따로 appender를 지정하지 않았을때 기본적으로 적용될 appender를 지정한다.

3. 프로젝트 적용

build.gradle

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.2.2'
	id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = '17'
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4:1.16'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
	useJUnitPlatform()
}

Log4jController.java : log레벨 확인 Controller

@Slf4j
@RestController
@RequestMapping("/log")
public class Log4jController {
    @GetMapping
    public void log4jTest() {
        log.error("error!!");
        log.warn("warn!!");
        log.info("info!!");
        log.debug("debug!!");
        log.trace("trace!!");
    }
}

logback-spring.xml

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!-- Profile 정보 -->
    <springProperty name="profile" source="spring.profiles.active"/>

  	<!-- console 색상 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>

    <!-- 변수 저장하는 곳 -->
    <property name="LOG_PATTERN"
              value="[%d{yyyy-MM-dd HH:mm:ss}] [%thread] %clr(%5level) %cyan(%logger) - %msg%n"/>
    <property name="FILE_LOG_PATTERN"
              value="[%d{yyyy-MM-dd HH:mm:ss}] [%thread] %5level %logger - %msg%n"/>

    <property name="LOG_DIRECTORY" value="/log/">
    <property name="LOG_FILE" value="log-file-${profile}"/>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIRECTORY}/${LOG_FILE}/%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- DB정보에 대한 logger 설정 -->
    <logger name="jdbc.audit" level="OFF"/>
    <logger name="jdbc.connection" level="OFF"/>
    <logger name="jdbc.resultset" level="OFF"/>
    <logger name="jdbc.resultsettable" level="INFO"/>
    <logger name="jdbc.sqlonly" level="OFF"/>
    <logger name="jdbc.sqltiming" level="INFO"/>

    <root level="INFO">
        <springProfile name="local">
            <appender-ref ref="CONSOLE"/>
        </springProfile>
        <springProfile name="!local">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        </springProfile>
    </root>
</configuration>

위와 같이 적용할 경우 profile이 local일 경우 console에서 log가 설정한 format대로 나오는 것을 확인할 수 있고 local일 아닐경우에 console과 file 모두에 잘 나오는 것을 확인할 수 있다.

참고
https://yainii.tistory.com/33
https://cofs.tistory.com/354

0개의 댓글