如果使用 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
兩張表不會有任何記錄,開啟參考:https://docs.abp.io/en/abp/latest/Audit-Logging#entity-history-selectors - 忽略指定網址路徑的審計日誌記錄,參考:https://docs.abp.io/en/abp/latest/Audit-Logging#abpaspnetcoreauditingoptions
- 預設開啟審計日誌的地方:所有 controller actions 的請求日誌,Get 請求除外,參考
AbpAuditingOptions.IsEnabledForGetRequests
;所有 Application Service 的調用日誌,前提是介面和服務必須繼承IApplicationService
和ApplicationService
才稱為 Application Service。 - 預設記錄所有 controller actions 的請求日誌
- 在 controller 或 controller actions 上添加
[DisableAuditing]
特性禁用審計日誌,參考:https://docs.abp.io/en/abp/latest/Audit-Logging#enable-disable-for-controllers-actions - 在 Application Service class 或 class methods 上添加
[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 - 如果想在 Background Worker 中記錄日誌,不需要為其添加
[Audited]
標記,因為定時任務不會經過 asp.net core 管道,就不會被創建 Audit Log Scope,那麼這個特性就沒用了,解決辦法是手動創建 AuditLogScope,當手動創建時,預設只會添加 AuditLog 記錄,不會為其添加 AuditLogAction 記錄,需要自己手動 Add,參考: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;
// // 保存所有 Entity 的更改記錄將需要大量的資料庫空間。因此,審計日誌系統預設禁用此功能,除非顯示配置它
// // 要保存所有實體的所有更改,只需使用 AddAllEntities() 擴展方法即可
// // 也可以調用 Add 函數來編寫 lambda 表達式來定義篩選條件,參考: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
}
BackGround Worker 代碼參考:
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 在你的任務執行結束時會對其 disposed.
//Logger.LogDebug("Starting: CustomerStatusCheckBackgroundWorker");
// 手動創建 Audit Log Scope: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
{
// do somethings..
auditingManager.Current.Log.Comments.Add($"一些適當的註釋");
}
catch (Exception ex)
{
//Add exceptions
auditingManager.Current.Log.Exceptions.Add(ex);
throw;
}
finally
{
// Always save the log
await auditingScope.SaveAsync();
}
}
//Logger.LogDebug("Completed: CustomerStatusCheckBackgroundWorker");
}
}
}