LoginSignup
9
7

More than 5 years have passed since last update.

Java WebアプリでSentryでログを記録する方法

Last updated at Posted at 2014-09-06

2016/07/15 追記

raven-javaのバージョンが上がって、導入方法がもっと簡単になっています。(確認時点でv7.0.0)
以下の章の実装は不要になっています。

  • Httpリクエストの内容を記録する
    • Servlet3.0のServletContainerInitializerの機能により、明示しなくてもlistenerが自動登録されるようになっています
  • 検索したい項目をタグとして記録する
    • logback.xmlの定義で、<extraTag>でタグ化したいキー名を列挙するだけでよくなっています

JavaのWebアプリでSentryでログを記録するときのメモを残しておきます。
ベースとして、raven-javaを使います

Httpリクエストの内容を記録する

raven-javaに含まれるRavenServletRequestListenerをweb.xmlにてlisternerに追加すれば、うまい具合にHttpリクエストの内容がログに付与されます。

web.xml
  <!-- Sentryログ出力内容設定機能を登録 -->
  <listener>
      <listener-class>net.kencochrane.raven.servlet.RavenServletRequestListener</listener-class>
  </listener>

細々とした内容をログに付与する

logbackなどのMDCを使うことでログに任意のkey,valueの値を記録できます。

  MDC.put("erroNo", exception.hashCode());
  logger.error("Error Log");

検索したい項目をタグとして記録する

SentryのWeb画面上にはログの検索機能があるのですが、メッセージなどの一部の内容でしか検索できません。
前述したMDC.put()で追加した内容は検索対象にならないので、困る場合があります。
そこで、検索したい項目をタグとして記録すれば、タグ検索を利用することができるようになります。

タグに値を記録するためには、以下のようにSentryAppenderを拡張します。
拡張したAppenderにてログエントリの生成処理にヘルパーを追加し、
その中でMDCの項目の一部をタグとして追加し直しています。

AppSentryAppender.scala
package lib

import net.kencochrane.raven.event.EventBuilder
import net.kencochrane.raven.event.helper.EventBuilderHelper
import net.kencochrane.raven.logback.SentryAppender
import net.kencochrane.raven.servlet.RavenServletRequestListener

/**
 * Sentryのログ出力を拡張するためのAppender
 */
class AppSentryAppender extends SentryAppender {

  override protected def initRaven() {
    super.initRaven()

    if (raven != null) {
      raven.addBuilderHelper(new AppSentryHelper)
    }
  }
}

/**
 * アカウント情報をタグで出力させる
 */
class AppSentryHelper extends EventBuilderHelper {

  override def helpBuildingEvent(eventBuilder: EventBuilder) {
    // MDCの一部をタグに登録
    Seq(
      "errorNo",
      "userId"
    ).foreach { key =>
        val v = MDC.get(key)
        if (v != null) {
          eventBuilder.addTag(key, v)
        }
      }


    // httpリクエストから情報を取得したい場合
    val request = RavenServletRequestListener.getServletRequest
    if (request != null) {

      request.foreach { account =>
        eventBuilder.addTag("account", account.id)
      }

    }

  }

}

その他

Sentryのログには、いくつかの専用のデータ構造を記録する機能があります。
Httpリクエストのログはその一部です。

ドキュメント以下のページなどで専用形式の項目の説明があるのでこれを利用してもよいかもしれません。

http://sentry.readthedocs.org/en/latest/developer/client/index.html#building-the-json-packet
http://sentry.readthedocs.org/en/latest/developer/interfaces/index.html

9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7