ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot] logback과 Sentry를 활용하여 에러 모니터링하기
    웹 개발/Spring Framework 2020. 5. 30. 17:27

    Sentry는 에러 모니터링을 위한 툴로 굉장히 많이 쓰이고 있는 툴이다.

     

    이번에 회사에서 Sentry 붙이는 작업을 했는데, 기존에는 global하게 적용되어 있지 않고, 선언적 방법으로 적용되어 있었다.

     

    즉, 내가 Sentry로 확인하고 싶은 부분만 메서드로 선언해서 보는 방식이었다. (Sentry.capture()라는 메서드를 활용하여..)

     

    이렇게 사용하면 시스템 전체 에러로그를 확인할 수 없고, 확인하고 싶다면 일일이 exception이 발생하는 부분에 일일이 선언해주어야 한다.

     

    시스템 전체 에러를 모니터링하기 위해 사용하는 툴이기에 global하게 적용할 수 있도록 방법을 찾아보았고, 적용한 방법을 정리했다.

     

    추가적으로 이 포스팅을 작성하기 위해 이것저것 테스트 해보는 와중에 더 간단하게 설정할 수 있도록 application.yml에 선언하여 사용할 수 있는 방법을 찾았는데 이걸 추가해 정리하려한다.


    Sentry 공식사이트에서 적용하는 방법이 3가지가 있었는데,

     

    1. 시스템 환경변수 적용

     

    2. 자바 시스템 프로퍼티에 적용

     

    3. 코드 상으로 적용

     

    그 전에 시스템 환경 변수와 자바 시스템 프로퍼티는 무엇인가? 이번 포스팅을 하면서 그 차이를 정확히 알고 싶어 찾아봤다.

     

    자바 시스템 프로퍼티, 시스템 환경변수의 차이

    자바 시스템 프로퍼티 : 자바 시스템 프로퍼티는 자바 커맨드 라인에 의해 set된다.

     

    그래서 자바 시스템 프로퍼티에 대한 접근은 이를 사용하는 프로세스에서만 접근이 가능하다.

     

    -Dpropertyname=value 같은 방식으로 사용된다. 또한 런타임에 System.setProperty(String key, String value) 또는 System.getProperties().load() 등의 방법을 이용해 시스템 프로퍼티를 setting 할 수 있다.

     

    환경변수 : 환경변수는 OS에 set된다. 그래서 아무 프로세스에서나 접근이 가능하다.

     

    리눅스에서 export HOME=/Users/myusername나 Windows에서 SET WINDIR=C:\Windows처럼 사용된다. 시스템 프로퍼티와 다르게 환경변수는 런타임에 set되지 않는다.


    앞으로 가장 유연하게 사용할 수 있을 것 같은 자바 시스템 프로퍼티 방식으로 적용하기로 했다.

     

    공식 레퍼런스에서는 자바 시스템 프로퍼티로 아래처럼 선언하면 값을 넣어주면 된다고 한다.

    java -Dsentry.dsn={클라이언트 키} -jar app.jar

    sentry.dsn이라는 시스템 프로퍼티를 커맨드라인에 입력해주면 되는 것이다.

     

    하지만 커맨드라인으로 설정하는 것도 좋지만, 코드상으로는 Sentry에 관한 설정이 눈에 띄지 않아 처음 보는 사람은 어떻게 설정하는거지? 의아함이 생길 것 같았고, spring boot에서 환경설정을 잡을 때 yaml 파일을 자주 사용하는데, 이 방식으로 설정을 잡아줄 방법이 없을까 고민했다.

     

    결국 시원한 해결방법을 찾아내긴했다!


    1. Client key 확인하기

    Sentry 공식사이트에 들어가서 TRY SENTRY FOR FREE를 클릭하고 회원가입을 한다.

     

    개인 계정의 경우에는 회사이름 대신 개인 이름을 입력하면 된다.

     

    플랫폼은 java, logback을 선택해준다.

     

    Setting > Projects > 사용하려는 프로젝트 순으로 클릭한다.

     

    Client Keys(DSN) > DSN을 확인한다. 이 key를 사용할 것이다.

     

    2. Gradle 의존성 넣기

    사용하고자하는 spring project의 build.gradle에 아래 dependency를 추가해주자.

     

    참고로 logback의 dependency는 필요없다. spring-boot-starter 안에 이미 필요한 의존성들이 들어가있다.

    // build.gradle
    compile 'io.sentry:sentry-logback:1.7.30'
    compile 'io.sentry:sentry-spring-boot-starter:1.7.30'
    

     

    3. logback-spring.xml 파일 만들기

    src/main/resources 경로에 logback-spring.xml 파일을 만들어주고 아래의 코드들을 넣어준다.

     

    Sentry의 로그 레벨은 보통 ERROR로 맞추는 것 같은데 공식 사이트에서는 WARN 레벨로 맞춰져있다.

    
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <!-- Configure the Console appender -->
        <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
    
        <!-- Configure the Sentry appender, overriding the logging threshold to the WARN level -->
        <appender name="Sentry" class="io.sentry.logback.SentryAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level>
            </filter>
            <!-- Optionally add an encoder -->
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
    
        <!-- Enable the Console and Sentry appenders, Console is provided as an example
     of a non-Sentry logger that is set to a different logging threshold -->
        <root level="INFO">
            <appender-ref ref="Console"/>
            <appender-ref ref="Sentry"/>
        </root>
    </configuration>
    

     

    여기서 커스텀하게 springProfile에 맞춰서 동작하게 사용할 수 있는데 원하는 환경에 맞게 아래처럼 사용할 수 있다.

        <!--개발 환경일 경우-->
        <springProfile name="develop">
            <root level="INFO">
                <appender-ref ref="Console" />
                <appender-ref ref="Sentry" />
            </root>
        </springProfile>
    
        <!--운영 환경일 경우-->
        <springProfile name="production">
            <root level="INFO">
                <appender-ref ref="Console" />
                <appender-ref ref="Sentry" />
            </root>
        </springProfile>
    

     

    4. application.yml 또는 환경에 따라 다른 application-develop.yml, application-production.yml 설정

    아까 1번에서 보았던 client key를 아래 {client-key}에 넣어주면 된다.

     

    production환경에 사용할 key 같은 경우는 보안상의 이유로 위에서 설명한 자바 시스템 프로퍼티를 커맨드라인으로 넣어주는게 좋겠다.

    // application.yml
    sentry:
       dsn: {client-key}
    

     

    특정한 패키지 경로에서만 동작시키고 싶다면, 아래처럼 stacktrace:app-packages: 로 패키지 경로를 추가해주면 된다.

    sentry:
       dsn: {client-key}
       stacktrace:
           app-packages: 
            - com.example.sentrytest

     

    5. Sentry로 에러 확인하기

    일부러 에러를 발생시켜서 오는지 확인해보니 잘 동작한다.

     

    디폴트로 가입한 email로 알림도 온다.(필요한 설정을 통해 슬랙 알림이 오도록 추가할 수도 있다.)

     

    issue 탭에서 에러 확인말고도 Sentry를 잘 활용할 수 있는 방법도 좀 찾아봐야겠다.


    참고:

    - 자바 시스템 프로퍼티와 환경변수 차이 - stackOverFlow

    - Sentry, Logback setting - Sentry 공식 사이트

    - Sentry DSN settins - Sentry 공식 사이트              

    - https://github.com/getsentry/sentry-java/pull/779

    - https://github.com/getsentry/sentry-java/issues/748

Designed by Tistory.