概要

ReadAuditは、監査目的で読み取りアクセスが記録される機能です。@ReadAuditを使用してエンティティBeanに注釈を付けると、これらのBean(クエリとL2キャッシュ内のヒット)の読み取りイベントが記録されます。

通常、ReadAuditPrepareインターフェースの実装が必要です。readAuditPrepare.prepare()メソッドは、ユーザーのコンテキスト情報(ユーザーID、ユーザーのIPアドレスなど)を使用してReadEventを設定します。

制約事項

現時点では、SqlQueryクエリは監査ログに記録されません(RawSqlクエリは監査の読み込みに含まれます)。

はじめる

ステップ1:@ReadAuditを追加します。

監査の読み込みが必要なすべてのエンティティBeanに@ReadAuditアノテーションを追加します。

@ReadAudit
@Entity
@Table(name = "customer")
public class Customer {
...

ステップ2:ReadAuditPrepareを実装します。

この手順をスキップしてReadAuditPrepareの実装を提供しない場合、'no op'実装が使用され、ユーザーのコンテキスト情報(ユーザーID、ユーザーのIPアドレスなど)は未入力のままです。

class MyReadAuditPrepare implements ReadAuditPrepare {

  @Override
  public void prepare(ReadEvent event) {

    // get user context information typically from a
    // ThreadLocal or similar mechanism

    String currentUserId = ...;
    event.setUserId(currentUserId);

    String userIpAddress = ...;
    event.setUserIpAddress(userIpAddress);

    event.setSource("myApplicationName");

    // add arbitrary user context information to the
    // userContext map
    event.getUserContext().put("some", "thing");
  }
}

ステップ3:ReadAuditPrepareの実装を登録します。

クラスパスのスキャンが有効になっている場合、ReadAuditPrepareの実装は自動的に検出できます(エンティティBeanが検出されるように)。つまり、スキャンがオンになっている場合、ReadAuditPrepareの実装を明示的に登録する必要はなく、代わりに検出されてインスタンス化されます。

スキャンが使用されていないか、ReadAuditPrepare実装に依存関係があり、そのインスタンス化はEbeanの外部で実行する必要がある場合は、その実装をDatabaseConfigに明示的に登録できます。

// example code explicitly registering the ReadAuditPrepare implementation

MyReadAuditPrepare readAuditPrepare = ...;

DatabaseConfig config = new DatabaseConfig();
...

// register explicitly here
config.setReadAuditPrepare(readAuditPrepare);


...
Database database = DatabaseFactory.create(config);

ステップ4:ログを構成します。

ReadAuditLoggerのデフォルト実装は、クエリプランエントリをio.ebean.ReadAuditQueryに、読み取りイベントをio.ebean.ReadAuditに記録します。クエリプランには完全なSQLが含まれており、これらのログを個別に記録することで、読み取りイベントに実行された完全なSQLを含める必要がなくなり、代わりにBeanタイプとクエリキーを使用して関連付けられたSQLを参照/検索できます。これにより、読み取りイベントログの一括/サイズが削減されます。

logback XML構成の以下に2つのアペンダーがあります。READAUDIT_QUERY_LOGはクエリプランをログ記録するためのもので、READAUDIT_LOGは読み取りBeanイベントをログ記録するためのもので。

<!-- LOGBACK configuration: separate loggers for the read auditing -->

<appender name="READAUDIT_QUERY_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <File>log/readAuditQuery.log</File>
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <FileNamePattern>log/readAuditQuery.log.%d{yyyy-MM-dd}</FileNamePattern>
    <MaxHistory>90</MaxHistory>
  </rollingPolicy>
  <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>%d{HH:mm:ss.SSS} %msg%n</pattern>
  </encoder>
</appender>

<appender name="READAUDIT_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <File>log/readAudit.log</File>
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <FileNamePattern>log/readAudit.log.%d{yyyy-MM-dd}</FileNamePattern>
    <MaxHistory>90</MaxHistory>
  </rollingPolicy>
  <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>%d{HH:mm:ss.SSS} %msg%n</pattern>
  </encoder>
</appender>


<logger name="io.ebean.ReadAuditQuery" level="TRACE" additivity="false">
  <appender-ref ref="READAUDIT_QUERY_LOG"/>
</logger>

<logger name="io.ebean.ReadAudit" level="TRACE" additivity="false">
  <appender-ref ref="READAUDIT_LOG"/>
</logger>

オプション:ReadAuditLoggerの実装

既定のロギングが適切でない場合は、ReadAuditLogger を実装してイベントのログ記録方法を制御できます。メッセージ キュー、データ ストアなどへ直接ログに記録します。

Query.setDisableReadAuditing()

特定のクエリに対して、リード監査から明示的に除外できます。一般的な使用例は、クエリがアプリケーション内で利用されてキャッシュの移入または大量データの処理が行われ、それらの情報をリード監査ログに出力しない場合です。