티스토리 뷰

Spring 토이 프로젝트에 log4j2와 slf4j를 적용해봤는데, 그 과정에서 꽤나 헤매서 정리를 좀 하려고 한다.

 

기본적으로 log4j.xml 에서 spring 구동 정보는 모두 DEBUG로 띄우도록 하고, AspectJ의 Before, After를 사용하여 프로젝트의 모든 메서드 시작 전, 후에 로그를 찍도록 설정했다.


1. dependency 추가

 

log4j-core와 이를 구현하기 위한 slf4j, 그리고 이 둘을 바인딩하기 위한 slf4j-simple까지 gradle에 추가해준다.

 

◎build.gradle

implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.17.1'
implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.17.1'
implementation group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.17.1'

 


2. log4j2.xml 

 

log4j2 config 파일을 resource폴더 바로 밑에 생성하여, Logging 설정을 해준다. 여기서 만약, resource가 아닌 다른 위치에 log4j2.xml 파일을 생성했다면, 해당 위치를 web.xml 에 명시해줘야 한다.

 

◎log4j2.xml

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

    <!-- Application Loggers -->
    <Loggers>
        <Logger name="org.springframework" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
        <Logger name="com.sgt" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
    </Loggers>
</Configuration>

우선, 간단하게 위와 같이 springframework 구동과 프로젝트 핵심 관심을 DEBUG LEVEL로 콘솔창에 띄우도록 했다.


3. LoggerService 작성

 

AOP 사용을 위한 횡단 관심인 LoggerService Class를 작성했다. SpringFramework에 대한 구동 정보만 기록해도 사실 큰 문제는 없으나, AspectJ를 사용하는데 굳이 안쓸 필요는 없을 거 같아서...

 

◎LoggerService.class

package com.sgt.logger;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Aspect
public class LoggerService {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Before("execution(* com.sgt.test.*.*.*(..))")
    public void beforeLog(JoinPoint jp) {
        logger.info("[" + jp.getTarget().getClass().getSimpleName() + "||" + jp.getSignature().getName() + " START]");
    }

    @After("execution(* com.sgt.test.*.*.*(..))")
    public void afterLog(JoinPoint jp) {
        logger.info("[" + jp.getTarget().getClass().getSimpleName() + "||" + jp.getSignature().getName() + " END]");
    }
}

여기까지 작성하면, Before과 After 메서드가 test 내부 모든 관심 앞, 뒤로 끼어들어 log를 찍을 것이다.


4. Output

 

프로젝트를 run해보면, 다음과 같이 SpringFramework 구동 정보가 로그로 찍히고

이어서, 3번에서 설정했던 Before, After메서드가 실행되면서 메서드 정보를 찍는다.

Comments