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