From 27e2461581497ccdff857daafeac01a0f9d0b24c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 15 Jan 2020 19:15:07 +0300 Subject: [PATCH] Created initial audit logging document. --- docs/en/Audit-Logging.md | 62 +++++++++++++++++- docs/en/Modules/Audit-Logging.md | 3 + docs/en/images/auditlog-object-diagram.png | Bin 0 -> 29134 bytes .../Auditing/AuditingInterceptorRegistrar.cs | 2 + 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 docs/en/Modules/Audit-Logging.md create mode 100644 docs/en/images/auditlog-object-diagram.png diff --git a/docs/en/Audit-Logging.md b/docs/en/Audit-Logging.md index f11a3f19e3..f2bbfafe52 100644 --- a/docs/en/Audit-Logging.md +++ b/docs/en/Audit-Logging.md @@ -1,3 +1,63 @@ # Audit Logging -TODO \ No newline at end of file +[Wikipedia](https://en.wikipedia.org/wiki/Audit_trail): "*An audit trail (also called **audit log**) is a security-relevant chronological record, set of records, and/or destination and source of records that provide documentary evidence of the sequence of activities that have affected at any time a specific operation, procedure, or event*". + +ABP Framework automates the audit logging by convention and provides configuration points to control the level of the audit logs. + +## IAuditingStore + +`IAuditingStore` is an interface that is used to save the audit log objects (explained below) by the ABP Framework. + +`SimpleLogAuditingStore` is used if no audit store was registered. It simply writes the audit object to the standard [logging system](Logging.md). + +However, [the audit logging module](Modules/Audit-Logging.md) has been configured in [the startup templates](Startup-Templates/Index.md) which writes audit log objects to a database (it supports multiple database providers). So, most of the times you don't care about how `IAuditingStore` was implemented and used. + +If you need to save the audit log objects to a custom data store, you can implement the `IAuditingStore` in your own application and replace using the [dependency injection system](Dependency-Injection.md). + +## Audit Log Object + +An **audit log object** is created for each **web request** is by default. An audit log object can be represented by the following relation diagram: + +![**auditlog-object-diagram**](D:\Github\abp\docs\en\images\auditlog-object-diagram.png) + +* **AuditLogInfo**: The root object with the following properties: + * `ApplicationName`: When you save audit logs of different applications to the same database, this property is used to distinguish the logs of the applications. + * `UserId`: Id of the current user, if the user has logged in. + * `UserName`: User name of the current user, if the user has logged in (this value is here to not depend on the identity module/system for lookup). + * `TenantId`: Id of the current tenant, for a multi-tenant application. + * `TenantName`: Name of the current tenant, for a multi-tenant application. + * `ExecutionTime`: The time when this audit log object has been created. + * `ExecutionDuration`: Total execution duration of the request, in milliseconds. This can be used to observe the performance of the application. + * `ClientId`: Id of the current client, if the client has been authenticated. A client is generally a 3rd-party application using the system over an HTTP API. + * `ClientName`: Name of the current client, if available. + * `ClientIpAddress`: IP address of the client/user device. + * `CorrelationId`: Current [Correlation Id]((CorrelationId.md)). Correlation Id is used to relate the audit logs written by different applications (or microservices) in a single logical operation. + * `BrowserInfo`: Browser name/version info of the current user, if available. + * `HttpMethod`: HTTP method of the current request (GET, POST, PUT, DELETE... etc.). + * `HttpStatusCode`: HTTP response status code for this request. + * `Url`: URL of the request. +* **AuditLogActionInfo**: An audit log action is typically a controller action or an [application service](Application-Services.md) method call during the web request. One audit log may contain multiple actions. An action object has the following properties: + * `ServiceName`: Name of the executed controller/service. + * `MethodName`: Name of the executed method of the controller/service. + * `Parameters`: A JSON formatted text representing the parameters passed to the method. + * `ExecutionTime`: The time when this method was executed. + * `ExecutionDuration`: Duration of the method execution, in milliseconds. This can be used to observe the performance of the method. +* **EntityChangeInfo**: Represents a change of an entity in this web request. An audit log may contain zero or more entity changes. An entity change has the following properties: + * `ChangeTime`: The time when the entity was changed. + * `ChangeType`: An enum with the following fields: `Created` (0), `Updated` (1) and `Deleted` (2). + * `EntityId`: Id of the entity that was changed. + * `EntityTenantId`: Id of the tenant this entity belongs to. + * `EntityTypeFullName`: Type (class) name of the entity with full namespace (like *Acme.BookStore.Book* for the Book entity). +* **EntityPropertyChangeInfo**: Represents a change of a property of an entity. An entity change info (explained above) may contain one or more property change with the following properties: + * `NewValue`: New value of the property. It is `null` if the entity was deleted. + * `OriginalValue`: Old/original value before the change. It is `null` if the entity was newly created. + * `PropertyName`: The name of the property on the entity class. + * `PropertyTypeFullName`: Type (class) name of the property with full namespace. +* **Exception**: An audit log object may contain zero or more exception. In this way, you can get a report of the failed requests. +* **Comment**: An arbitrary string value to add custom messages to the audit log entry. An audit log object may contain zero or more comments. + +In addition to the standard properties explained above, `AuditLogInfo`, `AuditLogActionInfo` and `EntityChangeInfo` objects implement the `IHasExtraProperties` interface, so you can add custom properties to these objects. + +## Audit Logging Module + +... \ No newline at end of file diff --git a/docs/en/Modules/Audit-Logging.md b/docs/en/Modules/Audit-Logging.md new file mode 100644 index 0000000000..a0c32699a5 --- /dev/null +++ b/docs/en/Modules/Audit-Logging.md @@ -0,0 +1,3 @@ +# Audit Logging Module + +TODO \ No newline at end of file diff --git a/docs/en/images/auditlog-object-diagram.png b/docs/en/images/auditlog-object-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..a7e86a2bb214f27b93032292f78d8d24eedf2fca GIT binary patch literal 29134 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