Edited at

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

More than 3 years have passed since last update.

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