技术控

    今日:9| 主题:49347
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] Audit.NET: A small framework to audit .NET object changes

[复制链接]
tobe3213 发表于 2016-10-6 07:29:08
281 12

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Audit.NET

  An extensible framework to audit executing operations in .NET including support for .NET Framework 4.5 and NetCore 1.0 (NetStandard 1.3).
   Generate an audit log with evidence for reconstruction and examination of activities that have affected specific operations or procedures.
  With Audit.NET you can generate tracking information about operations being executed. It will automatically log environmental information such as the caller user id, machine name, method name, exceptions, including the execution time and duration, exposing an extensible mechanism in which you can provide extra information or implement your output mechanism for the audit logs.
   Extensions to log to Files, Event Log, SQL, MongoDB, AzureBlob and DocumentDB are provided. And also extensions to audit different systems such as EntityFramework, MVC, WebAPI and WCF. SeeExtensionssection for more information.
  Install (NuGet)

  [code]PM> Install-Package Audit.NET[/code]  Contents

  
       
  • Usage   
  • Output Details   
  • Custom Fields and Comments   
  • Discard option   
  • Data providers   
  • Event Creation Policy   
  • Configuration   
  • Extensions  
  Usage

   Create an Audit Scope by calling the static AuditScope.Create method.
  Suppose you have the following code to cancel an order that you want to audit:
  [code]Order order = Db.GetOrder(orderId);
order.Status = -1;
order.OrderItems = null;
order = Db.OrderUpdate(order);[/code]   To audit this operation, you can surround the code with a using block that creates an AuditScope , indicating a target object to track:
  [code]Order order = Db.GetOrder(orderId);
using (AuditScope.Create("Order:Update", () => order))
{
    order.Status = -1;
    order.OrderItems = null;
    order = Db.OrderUpdate(order);
}[/code]   It is not mandatory to use a using block, but it simplifies the syntax when the code to audit is on a single block, allowing to detect exceptions and calculate the duration by implicitly saving the event on disposal.
   You can create an AuditScope and reuse it on different methods, for example to log a pair of Start / End methods calls as a single event:
  [code]public class SomethingThatStartsAndEnds
{
    private AuditScope auditScope;

    public int Status { get; set; }

    public void Start()
    {
        Status = 0;
        // Create the scope
        auditScope = AuditScope.Create("MyEvent", () => Status);
    }

    public void End()
    {
        Status = 1;
        // Dispose the scope (will save the event)
        auditScope.Dispose();  
    }
}[/code]   The first parameter of the Create method is an event type name intended to identify and group the events. The second is the delegate to obtain the object to track (target object). This object is passed as a Func to allow the library inspect the value at the beggining and at the disposal of the scope. It is not mandatory to supply a target object, pass null when you don't want to track a specific object.
   If you are not tracking an object, nor the duration of an event, you can use the CreateAndSave shortcut method that logs an event immediately. For example:
  [code]AuditScope.CreateAndSave("Event Type", new { ExtraField = "extra value" });[/code]   The library will generate an output ( AuditEvent ) for each operation, including:
  
       
  • Tracked object's state before and after the operation.   
  • Execution time and duration.   
  • Environment information such as user, machine, domain, locale, etc.   
  • Comments and Custom Fieldsprovided.  
  An example of the output in JSON:
  [code]{
    "EventType": "Order:Update",
    "Environment": {
        "UserName": "Federico",
        "MachineName": "HP",
        "DomainName": "HP",
        "CallingMethodName": "Audit.UnitTest.AuditTests.TestUpdate()",
        "Exception": null,
        "Culture": "en-GB"
    },
    "StartDate": "2016-08-23T11:33:14.653191-05:00",
    "EndDate": "2016-08-23T11:33:23.1820786-05:00",
    "Duration": 8529,
    "Target": {
        "Type": "Order",
        "Old": {
            "OrderId": "39dc0d86-d5fc-4d2e-b918-fb1a97710c99",
            "Status": 2,
            "OrderItems": [{
                "Sku": "1002",
                "Quantity": 3.0
            }]
        },
        "New": {
            "OrderId": "39dc0d86-d5fc-4d2e-b918-fb1a97710c99",
            "Status": -1,
            "OrderItems": null
        }
    }
}[/code]  Output details

  The following tables describes the output fields:
  
       
  • AuditEvent object

                          Field Name       Type       Description                              EventType        string       User-defined string to group the events                    Environment         Environment        Contains information about the execution environment                    StartDate        DateTime       Date and time when the event has started                    EndDate        DateTime       Date and time when the event has ended                    Duration        integer       Duration of the event in milliseconds                    Target         Target        User-defined tracked object                    Comments        Array of strings       User-defined comments                    CustomFields        Dictionary       User-defined custom fields   
  • Environment object

                          Field Name       Type       Description                              UserName        string       Current logged user name                    MachineName        string       Executing machine name                    DomainName        string       Current user domain                    CallingMethodName        string       Calling method signature information                    Exception        string       Indicates if an Exception has been detected (NULL if no exception has been thrown)                    Culture        string       Current culture identifier   
  • Target object

                          Field Name       Type       Description                              Type        string       Tracked object type name                    Old        Object       Value of the tracked object at the beginning of the event                    New        Object       Value of the tracked object at the end of the event  
  Custom Fields and Comments

   The AuditScope object provides two methods to extend the event output.
  
       
  •   With SetCustomField() you can store any object as a custom field.
       
  •   With Comment() you can add textual comments to the event.
      
  For example:
  [code]Order order = Db.GetOrder(orderId);
using (var audit = AuditScope.Create("Order:Update", () => order))
{
    audit.SetCustomField("ReferenceId", orderId);
    order.Status = -1;
    order = Db.OrderUpdate(order);
    audit.Comment("Status Updated to Cancelled");
}[/code]  The output of the previous example would be:
  [code]{
    "EventType": "Order:Update",
    "Environment": {
        "UserName": "Federico",
        "MachineName": "HP",
        "DomainName": "HP",
        "CallingMethodName": "Audit.UnitTest.AuditTests.TestUpdate()",
        "Exception": null,
        "Culture": "en-GB"
    },
    "Target": {
        "Type": "Order",
        "Old": {
            "OrderId": "39dc0d86-d5fc-4d2e-b918-fb1a97710c99",
            "Status": 2,

        },
        "New": {
            "OrderId": "39dc0d86-d5fc-4d2e-b918-fb1a97710c99",
            "Status": -1,

        }
    },
    "ReferenceId": "39dc0d86-d5fc-4d2e-b918-fb1a97710c99",           // <-- Custom Field
    "Comments": ["Status Updated to Cancelled"],                     // <-- Comments
    "StartDate": "2016-08-23T11:34:44.656101-05:00",
    "EndDate": "2016-08-23T11:34:55.1810821-05:00",
    "Duration": 8531
}[/code]   You can also set Custom Fields when creating the AuditScope , by passing an anonymous object with the properties you want as extra fields. For example:
  [code]using (var audit = AuditScope.Create("Order:Update", () => order, new { ReferenceId = orderId }))
{
    order.Status = -1;
    order = Db.OrderUpdate(order);
    audit.Comment("Status Updated to Cancelled");
}[/code]  Discard option

   The AuditScope object has a Discard() method to allow the user to discard an event under certain condition.
  For example, if you want to avoid saving the audit event when an exception is thrown:
  [code]using (var scope = AuditScope.Create("SomeEvent", () => someTarget))
{
    try
    {
        //some operation
        Critical.Operation();
    }
    catch (Exception ex)
    {
        //If an exception is thown, discard the audit event
        scope.Discard();
    }
}[/code]  Data providers

   A data provider contains the logic to handle the audit event output, where you define what to do with the audit logs.
   You can use one of thedata providers includedor inject your own mechanism by creating a class that inherits from AuditDataProvider , overriding the following methods:
  
       
  • InsertEvent : should return a unique ID for the event.   
  • ReplaceEvent : should update an event given its ID, this method is only called forCreation Policies Manual or InsertOnStartReplaceOnEnd .  
  For example:
  [code]Order order = Db.GetOrder(orderId);
order.Status = -1;
order.OrderItems = null;
order = Db.OrderUpdate(order);0[/code]   To indicate the data provider to use, assign the DataProvider property on the global Configuration object. SeeConfiguration sectionfor more information. For example:
  [code]Order order = Db.GetOrder(orderId);
order.Status = -1;
order.OrderItems = null;
order = Db.OrderUpdate(order);1[/code]  Or using the fluent API:
  [code]Order order = Db.GetOrder(orderId);
order.Status = -1;
order.OrderItems = null;
order = Db.OrderUpdate(order);2[/code]   As an anternative, you can define the mechanism at run time by using the DynamicDataProvider provider.
  For example:
  [code]Order order = Db.GetOrder(orderId);
order.Status = -1;
order.OrderItems = null;
order = Db.OrderUpdate(order);3[/code]  Or using the fluent API:
  [code]Order order = Db.GetOrder(orderId);
order.Status = -1;
order.OrderItems = null;
order = Db.OrderUpdate(order);4[/code]  Data providers included

  The Data Providers included are summarized in the following table:
              Data Provider     Package     Description      Configuration API                     FileDataProvider       Audit.NET      Store the audit logs as files. Dynamically configure the directory and path.      .UseFileLogProvider()               EventLogDataProvider       Audit.NET      Write the audit logs to the Windows EventLog.      .UseEventLogProvider()               DynamicDataProvider       Audit.NET       Dynamically change the behavior at run-time. Define Insert and a Replace actions with lambda expressions.       .UseDynamicProvider()               SqlDataProvider       Audit.NET.SqlServer       Store the events as rows in a MS SQL Table, in JSON format.       .UseSqlServer()               MongoDataProvider       Audit.NET.MongoDB       Store the events in a Mongo DB collection, in BSON format.       .UseMongoDB()               AzureDbDataProvider       Audit.NET.AzureDocumentDB       Store the events in an Azure Document DB collection, in JSON format.       .UseAzureBlobStorage()               AzureBlobDataProvider       Audit.NET.AzureStorage       Store the events in an Azure Blob Storage container, in JSON format.       .UseAzureDocumentDB()            Event Creation Policy

  The audit scope can be configured to persist the event in different ways:
  
       
  •   Insert on End:( default ) The audit event is saved when the scope is disposed.
       
  •   Insert on Start, Replace on End:The event (on its initial state) is saved when the scope is created, and then the complete event information is updated when the scope is disposed.
       
  •   Insert on Start, Insert on End:Two versions of the event are saved, the initial when the scope is created, and the final when the scope is disposed.
       
  •   Manual:The event saving (insert/replace) should be explicitly invoked by calling the Save() method on the AuditScope .
      
  You can set the Creation Policy per-scope, for example to explicitly set the Creation Policy to Manual:
  [code]Order order = Db.GetOrder(orderId);
order.Status = -1;
order.OrderItems = null;
order = Db.OrderUpdate(order);5[/code]  If you don't provide a Creation Policy, the default Creation Policy configured will be used (see next section).
  Configuration

  Data provider

   To change the default data provider, set the static property DataProvider on Audit.Core.Configuration class. This should be done prior to the AuditScope creation, i.e. during application startup.
  For example, to set your own provider as the default data provider:
  [code]Order order = Db.GetOrder(orderId);
order.Status = -1;
order.OrderItems = null;
order = Db.OrderUpdate(order);1[/code]  Creation Policy

   To change the default creation policy, set the static property SetCreationPolicy on Audit.Core.Configuration class. This should be done prior to the AuditScope creation, i.e. during application startup.
  For example, to set the default creation policy to Manual:
  [code]Order order = Db.GetOrder(orderId);
order.Status = -1;
order.OrderItems = null;
order = Db.OrderUpdate(order);7[/code]  Custom Actions

  You can configure Custom Actions that are executed for all the Audit Scopes in your application. This allows to globally change the behavior and data, intercepting the scopes after they are created or before they are saved.
   Call the static AddCustomAction() method on Audit.Core.Configuration class to attach a custom action.
  For example, to globally discard the events under centain condition:
  [code]Order order = Db.GetOrder(orderId);
order.Status = -1;
order.OrderItems = null;
order = Db.OrderUpdate(order);8[/code]  Or to add custom fields / comments globally to all scopes:
  [code]Order order = Db.GetOrder(orderId);
order.Status = -1;
order.OrderItems = null;
order = Db.OrderUpdate(order);9[/code]   The ActionType indicates when to perform the action. The allowed values are:
  
       
  • OnScopeCreated : When the Audit Scope is being created, before any saving. This is executed once per Audit Scope.   
  • OnEventSaving : When an Audit Scope's Event is about to be saved.  
  Configuration Fluent API

   Alternatively to the properties/methods mentioned before, you can configure the library using a convenient Fluent API provided by the method Audit.Core.Configuration.Setup() , this is the most straightforward way to configure the library.
  For example, to set the FileLog Provider with its default settings using a Manual creation policy:
  [code]Order order = Db.GetOrder(orderId);
using (AuditScope.Create("Order:Update", () => order))
{
    order.Status = -1;
    order.OrderItems = null;
    order = Db.OrderUpdate(order);
}0[/code]  Configuration examples

  File log provider with dynamic directory path and filename (fluent API):

  [code]Order order = Db.GetOrder(orderId);
using (AuditScope.Create("Order:Update", () => order))
{
    order.Status = -1;
    order.OrderItems = null;
    order = Db.OrderUpdate(order);
}1[/code]  File log provider with an InsertOnStart-ReplaceOnEnd creation policy, and a global custom field set in a custom action:
  [code]Order order = Db.GetOrder(orderId);
using (AuditScope.Create("Order:Update", () => order))
{
    order.Status = -1;
    order.OrderItems = null;
    order = Db.OrderUpdate(order);
}2[/code]  Event log provider with an InsertOnEnd creation policy (fluent API):

  [code]Order order = Db.GetOrder(orderId);
using (AuditScope.Create("Order:Update", () => order))
{
    order.Status = -1;
    order.OrderItems = null;
    order = Db.OrderUpdate(order);
}3[/code]  Dynamic provider to log to the console (fluent API):

  [code]Order order = Db.GetOrder(orderId);
using (AuditScope.Create("Order:Update", () => order))
{
    order.Status = -1;
    order.OrderItems = null;
    order = Db.OrderUpdate(order);
}4[/code]  Extensions

  The following packages are extensions to log interactions with different systems such as MVC, WebApi, WCF and Entity Framework:
   
Audit.NET: A small framework to audit .NET object changes-1 (framework,activities,procedures,different,execution)

  
       
  • Audit.WCF

    Generate detailed server-side audit logs for Windows Communication Foundation (WCF) service calls, by configuring a provided behavior.
       
  • Audit.EntityFramework

      Generate detailed audit logs for CRUD operations on Entity Framework, by inheriting from a provided DbContext . Includes support for EF 6 and EF 7 (EF Core).
       
  • Audit.WebApi

    Generate detailed audit logs by decorating Web API Methods and Controllers with an action filter attribute. Includes support for ASP.NET Core MVC.
       
  • Audit.MVC

    Generate detailed audit logs by decorating MVC Actions and Controllers with an action filter attribute. Includes support for ASP.NET Core MVC.
       
  • Audit.DynamicProxy

    Generate detailed audit logs for any class without changing its code by using a proxy.
      
  Storage providers

   Apart from the FileLog , EventLog and Dynamic event storage providers, there are others included in different packages:

Audit.NET: A small framework to audit .NET object changes-2 (framework,activities,procedures,different,execution)

  
       
  • Audit.NET.SqlServer

    Store the events as rows in a SQL Table, in JSON format.
       
  • Audit.NET.MongoDB

    Store the events in a Mongo DB Collection, in BSON format.
       
  • Audit.NET.AzureDocumentDB

    Store the events in an Azure Document DB Collection, in JSON format.
       
  • Audit.NET.AzureStorage

    Store the events in an Azure Blob Storage container, in JSON format.
      

友荐云推荐




上一篇:The Problem With Depmix For Online Regime Prediction
下一篇:Explained: WMI hijackers
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

凌薇 发表于 2016-10-6 09:01:39
土豪,交个朋友
回复 支持 反对

使用道具 举报

亦寒 发表于 2016-10-6 10:48:00
路过的帮顶
回复 支持 反对

使用道具 举报

liushixinglive 发表于 2016-10-8 03:03:07
星期六加班的飘过
回复 支持 反对

使用道具 举报

亦旋 发表于 2016-10-18 05:57:13
你拥有再大再多的水桶,也不如有一个水龙头。说明:”渠道很重要!
回复 支持 反对

使用道具 举报

逗比 发表于 2016-10-18 09:27:34
tobe3213 顶起!
回复 支持 反对

使用道具 举报

刘鑫磊 发表于 2016-10-20 19:54:29
鸟大了什么林子都有。。
回复 支持 反对

使用道具 举报

方小雪 发表于 2016-10-23 17:30:50
不要迷恋楼主,楼主只是个传说。
回复 支持 反对

使用道具 举报

頭痛~出賣了我 发表于 2016-10-25 00:19:02
人又不聪明,还学人家秃顶!!
回复 支持 反对

使用道具 举报

lili521 发表于 2016-10-26 20:32:24
系统居然说我是在灌水,我有吗?
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表