Spring Sentry 로깅 설정하기

wwlee94·2022년 11월 2일
2
post-thumbnail

2021년도에 정리했던 내용을 포스팅함.

Sentry란?

Sentry 는 자체 호스팅 및 클라우드 기반 오류 모니터링을 제공하여 모든 소프트웨어 팀이 실시간으로 오류를 발견하고 심사하고 우선 순위를 정할 수 있도록 제공하는 통합 관제 솔루션이다.

python 으로 작성된 로그 취합 및 분석 시스템으로 github에 오픈 소스로 공개되어 있으며 동작 방식에 따라 클라우드 버전온-프레미스 방식 2가지가 있음.

  • 클라우드는 상용만 제공되며 온-프레미스 방식은 커뮤니티와 상용 두 가지가 지원

Exception이나 오류. 로그들을 그룹화해서 빈도수 체크, 이벤트 그룹화 및 시각화해서 볼수 있는 장점

지원 플랫폼은 java, go, node, php, php(laravel), rust, javascript 및 거의 대부분의 frontend framework는 다 지원

Sentry 설정 과정

Sentry 웹 페이지 접속 후 회원가입

  1. https://sentry.io 해당 페이지로 접속해서 회원 가입 후 Oranization을 생성한다.

  2. Project 탭에 들어가서 Spring Boot 프로젝트를 생성

  3. build.gradle에 다음 의존성을 추가

    // Sentry
    implementation 'io.sentry:sentry-logback:1.7.30'
  4. resources 폴더에 다음 파일들을 추가

    • logback.xml

    다음과 같은 요소를 지정하는 설정 파일

    • 콘솔 상에 어떻게 로그를 출력할 것인지
    • Sentry에 로그 레벨을 무엇으로 설정할 것인지
    • 특정 패키지의 로그 레벨을 무엇으로 설정할 것인지
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <!--<pattern>app> %d{HH:mm:ss}|%-20t|%-5p|%logger|%C{10}|%M|%L|==> |%m!%n</pattern>-->
                <!-- 로그수준|발생시간|쓰레드이름|클래스명|메소드명|라인| ==> 로그내용|줄바꿈-->
                <pattern>%-5p %d{HH:mm:ss} [%t] %c{3}, %M at line %L; %m%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>WARN</level>
            </filter>
        </appender>
    
    	  <logger name="org.apache.commons" level="info"/>
    	  <logger name="org.springframework" level="info" />
        <logger name="org.apache.http.client.protocol" level="error"/>
        <logger name="com.jainwon.jobda" level="debug"/>
        <logger name="org.apache.http" level="info"/>
    
        <logger name="org.hibernate" level="info"/>
        <logger name="org.hibernate.SQL" level="debug"/>
        <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace"/>
    
    	  <root level="debug">
    		  <appender-ref ref="console"/>
    		  <appender-ref ref="sentry"/>
    	  </root>
    </configuration>
    • sentry.properties
    # SENTRY
    dsn={dsn주소} # sentry setting에서 조회 가능
    factory=com.jainwon.jobda.config.SentryConfig # Config 파일 경로
    # STACKTRACE APP PACKAGE
    stacktrace.app.packages=com.jainwon.jobda # 트래킹할 패키지 경로
  5. config 패키지에 다음 파일 추가

    @Slf4j
    public class SentryConfig extends DefaultSentryClientFactory {
    
        @Override
        public SentryClient createSentryClient(Dsn dsn) {
            String profile = System.getProperty("spring.profiles.active");
    
            // PR, ST 환경에서만 Sentry 로그 출력
            if (profile != null && (profile.equals(SpringProfiles.KR_PRODUCTION) || profile.equals(SpringProfiles.KR_STAGING))) {
                final SentryClient sentry = super.createSentryClient(dsn);
                sentry.addTag("spring.profile", profile);
                return sentry;
            }
            // Local 환경이나 센트리 설정중 에러시 Sentry 로그를 보내지 않음
            return new SentryClient(new NoopConnection(), new ThreadLocalContextManager());
        }
    }
  6. 테스트 해보기!

    임의로 Exception을 발생시키면 sentry에 해당 로그가 찍힌다.

    @RestController
    public class BaseController {
    
        @GetMapping(value = "/sentry")
        public String index() throws Exception {
            throw new Exception("This is a test.");
        }
    }

원래, Sentry는 Sentry.capture()라는 메서드를 활용해서 선언적으로만 로그를 남길 수 있는데 Logback과 함께하면 위와 같이 일반적인 Exception도 로깅을 남길 수 있다 !

로깅 활용

부가 기능

Alerts

센트리에서는 이외에도 알림 기능이 존재한다.

Performance에 트랜잭션 소요 시간 관련한 데이터 모니터링도 가능해서
Rule을 설정하여 특정 시간 이상 걸리는 트랜잭션이 발생하는 경우에 알림을 보낸다던지

Sentry 로그가 1시간에 동일한 에러가 5번 이상 발생한 경우에 알림을 보낸다던지의 컨트롤이 가능하다.

알림의 경우는 Sentry 그룹원들에게 메일을 보내거나 Webhook을 사용하여 알림 보내기가 가능하다.

Rule 설정 예시

Webhook으로 MS Teams로 메시지 알림을 보낸 모습

레퍼런스

profile
개발 블로그 📝

0개의 댓글