目的
Webアプリ(Spring)で発生したエラーをSentryを使ってユーザーのOSやブラウザの情報を収集する
Sentryって何?
JavaやJavaScriptやC#といった多種多様な言語のエラーログを収集するOSS。
Webアプリを使用したブラウザやOSまで拾えるから便利。
手順
Sentryの公式ページでアカウント作成
https://www.getsentry.com/signup/
Sentryのチームとプロジェクト作成
以下の画面よりJavaを選択し、プロジェクトを作成
プロジェクトのDSNを取得
プロジェクトのSettingsのClient Keysを選択して以下のDSNのURLをコピーする
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のプロジェクトにエラーが蓄積される