스프링

스프링부트에서 AOP를 활용하여 Sentry 및 기본 파일로 Log 적용하기

JANNNNNN 2024. 5. 2. 12:21

AOP란?

AOP는 관점 지향 프로그래밍을 의미하며, 애플리케이션의 여러 부분에서 반복적으로 발생하는 작업을 모듈화하는 기술입니다!  주요 관심사(Concerns)를 분리하여 모듈화함으로써 보안, 로깅, 트랜잭션 관리 등과 같은 부가적인 기능을 중앙에서 관리하고 적용할 수 있다는 장점이 있습니다.

➕예를들어, 로그인을 할 때 유효성검사나 로그같은 로직들은 매 컨트롤러마다 적어두면 컨트롤러가 무거워지기 때문에 AOP로 따로 빼서 객체지향 관점으로 실행시키는 것이 바로 AOP입니다.

Sentry로 로그 및 예외 관리하기

스프링부트 애플리케이션을 개발할 때, AOP(Aspect-Oriented Programming)를 사용하여 중요한 부분에서 로그 및 예외를 관리하는 것은 매우 중요합니다! AOP를 사용하면 코드 중복을 줄이고 애플리케이션의 안정성과 유지보수성을 향상시킬 수 있기 때문인데요. 또한 Sentry와 Log4j2와 같은 로깅 및 예외 처리 도구를 통합함으로써 애플리케이션의 모니터링 및 디버깅을 더욱 효과적으로 할 수 있습니다.

 

먼저, AOP를 사용하여 애플리케이션의 핵심 로직에 로깅 및 예외 처리를 적용하는 방법을 알아보겠습니다. 스프링부트에서는 @Aspect 어노테이션을 사용하여 AOP를 구현할 수 있습니다. 예를 들어, 특정 서비스 메소드가 실행될 때 로그를 기록하고 예외를 처리하는 Aspect를 작성할 수 있습니다.

@Aspect
@Component
public class LoggingAspect {
    
    private static final Logger logger = LogManager.getLogger(LoggingAspect.class);
    
    @Around("execution(* com.example.service.*.*(..))")
    public Object logMethodExecution(ProceedingJoinPoint joinPoint) throws Throwable {
        logger.info("Method execution started: " + joinPoint.getSignature());
        try {
            Object result = joinPoint.proceed();
            logger.info("Method execution successful: " + joinPoint.getSignature());
            return result;
        } catch (Exception e) {
            logger.error("Method execution failed: " + joinPoint.getSignature(), e);
            throw e;
        }
    }
}

다음으로, Sentry와 Log4j2를 통합하여 애플리케이션의 로그와 예외를 효과적으로 관리하는 방법을 살펴보겠습니다. Sentry는 실시간으로 애플리케이션의 이슈를 모니터링하고 추적할 수 있는 플랫폼입니다. Log4j2는 다양한 로그 메시지를 다양한 출력 대상으로 라우팅할 수 있는 강력한 로깅 프레임워크입니다.

[Sentry 홈페이지]

https://sentry.io/welcome/

<dependency>
    <groupId>io.sentry</groupId>
    <artifactId>sentry-spring-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
</dependency>

그런 다음, application.properties 파일에 Sentry DSN 및 Log4j2 설정을 추가합니다.

sentry.dsn=<YOUR_SENTRY_DSN>
logging.level.root=INFO

이제 애플리케이션을 실행하고 Sentry 대시보드에서 로그 및 예외를 모니터링할 수 있습니다. AOP를 사용하여 로깅 및 예외 처리를 자동화하고 Sentry와 Log4j2를 통합함으로써 애플리케이션의 안정성과 유지보수성을 향상시킬 수 있습니다.!

스프링부트 파일로 관리하기

스프링부트에서는 Logback 또는 Log4j2와 같은 로깅 프레임워크를 사용하여 로그를 파일로 관리할 수 있습니다. 이를 통해 애플리케이션의 로그를 파일에 기록하고 필요에 따라 관리할 수 있어 편리합니다!

여기에는 Logback을 사용하여 로그를 파일로 관리하는 방법을 설명하겠습니다.

  1. 의존성 추가: 먼저, pom.xml 파일에 Logback 의존성을 추가합니다.
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>

 

2. 로그 설정 파일 생성: resources 디렉토리에 logback-spring.xml 파일을 생성하여 로그 및 파일 설정을 정의합니다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <springProfile name="production">
        <!-- 로그 파일 경로 및 형식 설정 -->
        <property name="LOG_FILE" value="logs/myapp.log"/>
        <appender name="FILE" class="ch.qos.logback.core.FileAppender">
            <file>${LOG_FILE}</file>
            <encoder>
                <pattern>%date [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>

        <!-- Root 로거 설정 -->
        <root level="INFO">
            <appender-ref ref="FILE"/>
        </root>
    </springProfile>
</configuration>

위의 설정에서는 logs/myapp.log 파일에 로그를 기록하도록 지정하고, 로그 포맷을 정의하였습니다.

 

3. 로그 레벨 설정: application.properties 파일에 로그 레벨을 설정하여 원하는 로그 레벨로 로깅을 관리할 수 있습니다.

logging.level.root=INFO

위의 설정에서는 루트 로거의 로그 레벨을 INFO로 설정하였습니다.

  1. FATAL: 가장 높은 로그 레벨이며, 치명적인 오류를 나타냅니다. 애플리케이션이 중단될 가능성이 있는 심각한 오류를 기록합니다.
  2. ERROR: 에러를 나타내는 로그 레벨입니다. 심각한 문제 또는 예외 상황을 나타냅니다.
  3. WARN: 경고성 메시지를 로깅하는 데 사용됩니다. 잠재적인 문제가 발생했지만 애플리케이션이 계속 실행될 수 있는 경우 사용됩니다.
  4. INFO: 정보성 로그를 나타내는 데 사용됩니다. 주요 이벤트나 상태 변경과 같은 중요한 정보를 기록합니다.
  5. DEBUG: 디버그 정보를 로깅하는 데 사용됩니다. 개발 중에 애플리케이션의 상태를 추적하고 문제를 해결하는 데 유용합니다.
  6. TRACE: 가장 상세한 로그 레벨이며, TRACE 레벨의 로그는 애플리케이션의 동작 과정에서 매우 세부적인 정보를 제공합니다. 보통 개발 및 디버깅 목적으로 사용됩니다.

➡️즉, root=TRACE로 하면 1~6까지의 레벨이 모두 다 보입니다.

 

로그 레벨이 높아질수록 해당 레벨 이상의 로그 레벨의 메시지도 함께 기록됩니다. 따라서 FATAL 레벨을 설정하면 FATAL 레벨 이상의 모든 로그가 기록됩니다.

이제 애플리케이션을 실행하면 설정한 경로에 로그 파일이 생성되고, 애플리케이션의 로그가 해당 파일에 기록됩니다. 이를 통해 애플리케이션의 동작 상태를 추적하고 디버깅할 수 있습니다!