目的

Webアプリ(Spring)で発生したエラーをSentryを使ってユーザーのOSやブラウザの情報を収集する

Sentryって何?

JavaやJavaScriptやC#といった多種多様な言語のエラーログを収集するOSS。
Webアプリを使用したブラウザやOSまで拾えるから便利。

手順

Sentryの公式ページでアカウント作成

https://www.getsentry.com/signup/

Sentryのチームとプロジェクト作成

以下の画面よりJavaを選択し、プロジェクトを作成

sentry1.png

プロジェクトのDSNを取得

プロジェクトのSettingsのClient Keysを選択して以下のDSNのURLをコピーする

sentry1.png

 Mavenにパッケージインストール

Sentry-logbackはログ出力の内容をSentryに送るライブラリ

pom.xml
        <dependency>
            <groupId>io.sentry</groupId>
            <artifactId>sentry-spring</artifactId>
            <version>1.7.4</version>
        </dependency>
        <dependency>
            <groupId>io.sentry</groupId>
            <artifactId>sentry-logback</artifactId>
            <version>1.2.0</version>
        </dependency>

 JavaにSentryの設定を記載しBeanを追加

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.HandlerExceptionResolver;

import io.sentry.Sentry;

@SpringBootApplication
public class SentryApplication {
    public static void main(String[] args) {
        SpringApplication.run(SentryApplication.class, args);
        Sentry.init("https://xxxxxxxxxxxxxxx@sentry.io/1202285");
    }
    @Bean
    public HandlerExceptionResolver sentryExceptionResolver() {
        return new io.sentry.spring.SentryExceptionResolver();
    }
    @Bean
    public ServletContextInitializer sentryServletContextInitializer() {
        return new io.sentry.spring.SentryServletContextInitializer();
    }
}

 LogBackにSentryを追加

resource配下に以下のファイルを設置

logback.xml
<configuration>

  <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>

  <appender name="Sentry" class="io.sentry.logback.SentryAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>WARN</level>
    </filter>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="Console" />
    <appender-ref ref="Sentry"/>
  </root>

</configuration>

 Controllerクラスにログ出力記載

logger.errorとlogger.warnの内容がSentryに送られる

    @RequestMapping("/")
    public String list(Model model) {
        logger.info("sentry info");
        logger.error("sentry error");
        logger.warn("sentry warn");
        return "Greetings from Spring Boot!";
    }

 結果

Sentryから登録したメールアドレスにエラーメールが送信させる。
またSentryのプロジェクトにエラーが蓄積される

sentry1.png