EF Core ストレージを使用する場合、Abp の監査ログは最終的に以下の 4 つのタイプに対応するテーブルに保存されます:
AuditLog、AuditLogAction、EntityChanges、EntityPropertyChanges の属性説明は参考:https://docs.abp.io/en/abp/latest/Audit-Logging#audit-log-object
公式には詳細に記載されていますが、この記事では注意すべき点のみを記録します:
- デフォルトでは HTTP Get リクエストの監査ログは記録されません。設定を有効にするには
AbpAuditingOptions..IsEnabledForGetRequests = true;
ApplicationName
設定を変更するにはAbpAuditingOptions..ApplicationName = "";
- デフォルトではエンティティ変更の記録は無効になっており、つまり
AbpEntityChanges
とAbpEntityPropertyChanges
の 2 つのテーブルには記録がありません。有効にするには参考:https://docs.abp.io/en/abp/latest/Audit-Logging#entity-history-selectors - 特定の URL パスの監査ログ記録を無視するには、参考:https://docs.abp.io/en/abp/latest/Audit-Logging#abpaspnetcoreauditingoptions
- デフォルトで監査ログが有効な場所:すべてのコントローラーアクションのリクエストログ、Get リクエストを除く、参考
AbpAuditingOptions.IsEnabledForGetRequests
;すべてのアプリケーションサービスの呼び出しログ、前提としてインターフェースとサービスはIApplicationService
とApplicationService
を継承する必要があります。これを Application Service と呼びます。 - デフォルトですべてのコントローラーアクションのリクエストログを記録します。
- コントローラーまたはコントローラーアクションに
[DisableAuditing]
属性を追加して監査ログを無効にするには、参考:https://docs.abp.io/en/abp/latest/Audit-Logging#enable-disable-for-controllers-actions - アプリケーションサービスクラスまたはクラスメソッドに
[DisableAuditing]
属性を追加して監査ログを無効にするには、参考:https://docs.abp.io/en/abp/latest/Audit-Logging#enable-disable-for-application-services-methods - 他のサービスの監査ログを有効 / 無効にするには、
[Audited]
と[DisableAuditing]
属性を追加するだけです。参考:https://docs.abp.io/en/abp/latest/Audit-Logging#enable-disable-for-other-services - 特定のエンティティとエンティティ属性の監査ログを有効 / 無効にするには、参考:https://docs.abp.io/en/abp/latest/Audit-Logging#enable-disable-for-entities-properties
- 監査ログ保存の実装をカスタマイズするには、参考:https://docs.abp.io/en/abp/latest/Audit-Logging#iauditingstore
- 監査ログ記録の属性値を変更するには、
IAuditingManager
インターフェースを注入して変更します。参考:https://docs.abp.io/en/abp/latest/Audit-Logging#iauditlogscope-iauditingmanager - バックグラウンドワーカーでログを記録したい場合、
[Audited]
マークを追加する必要はありません。なぜなら、定期的なタスクは asp.net core パイプラインを通過しないため、Audit Log Scope が作成されないからです。この属性は無効になります。解決策は手動で AuditLogScope を作成することです。手動で作成する場合、デフォルトでは AuditLog の記録のみが追加され、AuditLogAction の記録は追加されません。自分で手動で追加する必要があります。参考:https://docs.abp.io/en/abp/latest/Audit-Logging#manually-create-an-audit-log-scope
MiaoXinWebModule.cs で AbpAuditingOptions を設定します:
public override void ConfigureServices(ServiceConfigurationContext context)
{
...
ConfigureAuditing();
}
private void ConfigureAuditing()
{
// 設定の説明:https://docs.abp.io/en/abp/latest/Audit-Logging#abpauditingoptions
//Configure<AbpAuditingOptions>(options =>
//{
// // HTTP Get リクエストのログ記録、デフォルトは false。通常、Get リクエストはデータベースに変更を加えるべきではないため、監査ログを記録する必要はありません。
// //options.IsEnabledForGetRequests = true;
// // すべてのエンティティの変更記録を保存するには、大量のデータベーススペースが必要です。したがって、監査ログシステムはデフォルトでこの機能を無効にしています。明示的に設定しない限り。
// // すべてのエンティティのすべての変更を保存するには、AddAllEntities() 拡張メソッドを使用するだけです。
// // また、Add 関数を呼び出してラムダ式を記述し、フィルタ条件を定義することもできます。参考:https://docs.abp.io/en/abp/latest/Audit-Logging#entity-history-selectors
// //options.EntityHistorySelectors.AddAllEntities();
//});
// 特定のパスの監査ログ記録を無視する必要がある場合は、参考:https://docs.abp.io/en/abp/latest/Audit-Logging#abpaspnetcoreauditingoptions
}
バックグラウンドワーカーのコード参考:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Auditing;
using Volo.Abp.BackgroundWorkers;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Threading;
using Volo.Abp.Uow;
namespace ?.BackgroundWorkers
{
/// <summary>
/// ユーザーの有効期限を設定します
///
/// https://docs.abp.io/zh-Hans/abp/latest/Background-Workers#asyncperiodicbackgroundworkerbase
///
/// AsyncPeriodicBackgroundWorkerBase は DoWorkAsync メソッドによってスローされた例外をキャッチして記録します。
/// </summary>
public class CustomerStatusCheckBackgroundWorker : AsyncPeriodicBackgroundWorkerBase
{
public CustomerStatusCheckBackgroundWorker(
AbpAsyncTimer timer,
IServiceScopeFactory serviceScopeFactory
)
: base(timer, serviceScopeFactory)
{
// 毎時実行
//Timer.Period = 1 * 60 * 60 * 1000;
Timer.Period = 5 * 1000; // 5 秒ごとにテスト実行
}
// https://docs.abp.io/en/abp/latest/Unit-Of-Work#unitofworkattribute
// https://support.abp.io/QA/Questions/1753/SystemObjectDisposedException-Cannot-access-a-disposed-context-instance
[UnitOfWork]
protected override async Task DoWorkAsync(PeriodicBackgroundWorkerContext workerContext)
{
// 依存関係を解決するには PeriodicBackgroundWorkerContext を使用する方が良いです。コンストラクタではなく。
// AsyncPeriodicBackgroundWorkerBase はタスクの実行が終了する際に IServiceScope を破棄します。
//Logger.LogDebug("Starting: CustomerStatusCheckBackgroundWorker");
// 監査ログスコープを手動で作成します:https://docs.abp.io/en/abp/latest/Audit-Logging#manually-create-an-audit-log-scope
var auditingManager = workerContext.ServiceProvider.GetRequiredService<IAuditingManager>();
using (var auditingScope = auditingManager.BeginScope())
{
auditingManager.Current.Log.Url = "BackgroundWorker-CustomerStatusCheck";
try
{
// 何かを実行..
auditingManager.Current.Log.Comments.Add($"適切なコメントをいくつか追加");
}
catch (Exception ex)
{
//例外を追加
auditingManager.Current.Log.Exceptions.Add(ex);
throw;
}
finally
{
// 常にログを保存
await auditingScope.SaveAsync();
}
}
//Logger.LogDebug("Completed: CustomerStatusCheckBackgroundWorker");
}
}
}