基於DDD的現代ASP.NET開發框架--ABP系列之19、ABP應用層——審計日誌

ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。

維基百科定義:審計跟蹤(也稱為稽核日誌)是一個安全相關的時間順序記錄,記錄這些記錄的目的是為已經影響在任何時候的詳細操作,提供程式執行的證明檔案記錄、源或事件。

ABP提供了能夠為應用程式互動自動記錄日誌的基礎設施,它能記錄你呼叫的方法的呼叫者資訊和引數資訊。從根本上來說,儲存區域包含:

  • tenant id(相關的租戶Id),
  • user id(請求使用者Id),
  • server name(請求的服務名稱【呼叫方法對應的類】),
  • method name(呼叫方法名稱),
  • parameters(方法的引數【JSON格式】),
  • execution time(執行時間),
  • duration (執行耗時時間【通常是毫秒】),
  • IP address (客戶端IP地址),
  • computer name(客戶機名稱),
  • exception (異常【如果方法丟擲異常】)等資訊。
  • 有了這些資訊,我們不僅能夠知道誰進行了操作,還能夠估算出應用程式的效能及丟擲的異常。甚至更多的,你可以得到有關應用程式的使用情況統計。

審計系統使用IAbpSession介面來獲取當前使用者Id和租戶ID。

注意:關於IAuditingStore介面

審計系統使用IAuditingStore介面來儲存審計資訊。module-zero專案是這個介面的完整實現,當然你也可以通過自己的方式來實現這個介面。如果你不想自己實現這個介面,SimpleLogAuditingStore類可以直接拿來使用,它是實現方式是將審計資訊寫入日誌中。

 配置

可以在你的模組初始化方法(PreInitialize)中使用Configuration.Auditing的屬性來配置審計,Auditing屬性預設是啟用狀態(即true)。你可以禁用它,如下圖所示:

public class MyModule : AbpModule
{
    public override void PreInitialize()
    {
        Configuration.Auditing.IsEnabled = false;
    }

    //...
}
.

以下是審計配置的屬性:

  • IsEnabled: 用於設定完全啟用或禁用審計系統。預設值:true.
  • IsEnabledForAnonymousUsers:如果設定成ture,未登陸的使用者的審計日誌也會儲存。預設值: false.
  • MvcControllers: 在ASP.NET MVC 控制器中使用審計日誌
  • IsEnabled: 在ASP.NET MVC中啟用(true)或禁用(false)審計日誌. 預設值: true.
  • IsEnabledForChildActions: 為MVC actions啟用(true)或禁用(false)審計日誌. 預設值: false.
  • Selectors: 選擇使用其他類來處理審計日誌的儲存。

正如你所看到的,審計系統單獨為mvc控制器提供了審計配置使之可以使用不同的方法來使用它。

Selectors是一個斷言(推斷型別)選擇器列表,用於選擇那種方式來儲存審計日誌。每一個選擇器包含一個唯一的名稱和一個斷言。斷言列表中預設的選擇器,使用的是應用程式服務類。如下圖所示:

Configuration.Auditing.Selectors.Add(
    new NamedTypeSelector(
        "Abp.ApplicationServices",
        type => typeof (IApplicationService).IsAssignableFrom(type)
    )
);

你可以在自己的模組初始化方法(PreInitialize)中新增自己的斷言選擇器。同樣的,如果你不喜歡使用應用程式服務來儲存審計日誌,你也可以通過名稱(name)來移除斷言選擇器,這就是為什麼斷言選擇器的名稱必須是唯一的(你也可以通過Linq的方式查詢到選擇器來移除它)。

通過屬性來啟用和禁用審計日誌

當你使用配置項來配置斷言選擇器時,你可以通過使用Audited和DisableAuditing特性標記到單個類或單個方法來實現審計系統的啟用和禁用。例如:

[Audited]
public class MyClass
{
    public void MyMethod1(int a)
    {
        //...
    }

    [DisableAuditing]
    public void MyMethod2(string b)
    {
        //...
    }

    public void MyMethod3(int a, int b)
    {
        //...
    }
}

上述列子中,MyClass類中除了MyMethod2明確標記不需要審計外,其他的方法都會被審計。Audited特效能夠幫助你只想儲存審計日誌的方法,進行審計日誌儲存。

說明

儲存審計日誌的方法必須是public修飾的,private和protected修飾的方法將會被忽略。 如果呼叫的方法不在類的引用範圍內,那麼引用的方法必須是虛方法(virtual),如果依賴注入的是它自己的介面則不需要是虛方法(例如注入 IPersonService 來使用 PersonService類)。

ABP使用動態代理和攔截機制以後,使用虛方法是必須的。對MVC Controller actions 使用審計日誌不是正確的做法,因為他們可能不是虛方法。

希望更多國內的架構師能關注到ABP這個專案,也許這其中有能幫助到您的地方,也許有您的參與,這個專案可以發展得更好。

歡迎加QQ群:

ABP架構設計交流群:134710707 ABP架構設計交流群      ABP架構設計交流2群: 579765441ABP架構設計交流群2