如何实现泛型Audit.NETjson数据处理?
How to achieve generic Audit.NET json data processing?
我正在使用 Audit.Net 库将 EntityFramework 操作记录到数据库中(目前所有内容都记录到一个 AuditEventLogs table,其中 JsonData 列将数据存储在以下 Json 格式:
{
"EventType":"MyDbContext:test_database",
"StartDate":"2021-06-24T12:11:59.4578873Z",
"EndDate":"2021-06-24T12:11:59.4862278Z",
"Duration":28,
"EntityFrameworkEvent":{
"Database":"test_database",
"Entries":[
{
"Table":"Offices",
"Name":"Office",
"Action":"Update",
"PrimaryKey":{
"Id":"40b5egc7-46ca-429b-86cb-3b0781d360c8"
},
"Changes":[
{
"ColumnName":"Address",
"OriginalValue":"test_address",
"NewValue":"test_address"
},
{
"ColumnName":"Contact",
"OriginalValue":"test_contact",
"NewValue":"test_contact"
},
{
"ColumnName":"Email",
"OriginalValue":"test_email",
"NewValue":"test_email2"
},
{
"ColumnName":"Name",
"OriginalValue":"test_name",
"NewValue":"test_name"
},
{
"ColumnName":"OfficeSector",
"OriginalValue":1,
"NewValue":1
},
{
"ColumnName":"PhoneNumber",
"OriginalValue":"test_phoneNumber",
"NewValue":"test_phoneNumber"
}
],
"ColumnValues":{
"Id":"40b5egc7-46ca-429b-86cb-3b0781d360c8",
"Address":"test_address",
"Contact":"test_contact",
"Email":"test_email2",
"Name":"test_name",
"OfficeSector":1,
"PhoneNumber":"test_phoneNumber"
},
"Valid":true
}
],
"Result":1,
"Success":true
}
}
我和我的团队有一个主要方面要实现:
能够创建管理员可以告诉的搜索页面
- 谁改变了
- 他们改变了什么
- 改变是什么时候发生的
他们可以给一个时间段,来减少审计记录的数量,有趣的部分来了:
应该有一个输入文本字段,让他们可以在“ColumnValues”部分的值中搜索。
我遇到的问题:
- 即使我将 Json 结构映射到关系行中,我也无法在保持通用性的情况下在每一列中进行搜索。
- 如果我不映射,我可以使用 LIKE mssql 函数在 Json 字符串中进行搜索,但是在大约 100,000 条记录的顺序上,查询需要很长时间才能完成,所以它可能不是顺便。
保持通用性很重要,因此我们不需要在每次创建或修改新实体时都修改审核搜索页面。
我只知道 MSSQL,但是将审计日志存储在像 cosmosDB 这样的面向文档的数据库(或其他任何数据库,这只是一个示例)中是否可以解决我的问题?或者我可以使用 MSSQL 等关系数据库达到所需的行为吗?
看来您是在征求意见,在这种情况下,我强烈推荐面向文档的数据库。
CosmosDB 可能是一个不错的选择,因为它支持 SQL 查询。
有一个扩展可以从 Audit.NET 登录到 CosmosDB:Audit.AzureCosmos
示例查询:
SELECT c.EventType, e.Table, e.Action, ch.ColumnName, ch.OriginalValue, ch.NewValue
FROM c
JOIN e IN c.EntityFrameworkEvent.Entries
JOIN ch IN e.Changes
WHERE ch.ColumnName = "Address" AND ch.OriginalValue = "test_address"
Here 是一个很好的 post,在 CosmosDB
上有很多复杂 SQL 查询的例子
我正在使用 Audit.Net 库将 EntityFramework 操作记录到数据库中(目前所有内容都记录到一个 AuditEventLogs table,其中 JsonData 列将数据存储在以下 Json 格式:
{
"EventType":"MyDbContext:test_database",
"StartDate":"2021-06-24T12:11:59.4578873Z",
"EndDate":"2021-06-24T12:11:59.4862278Z",
"Duration":28,
"EntityFrameworkEvent":{
"Database":"test_database",
"Entries":[
{
"Table":"Offices",
"Name":"Office",
"Action":"Update",
"PrimaryKey":{
"Id":"40b5egc7-46ca-429b-86cb-3b0781d360c8"
},
"Changes":[
{
"ColumnName":"Address",
"OriginalValue":"test_address",
"NewValue":"test_address"
},
{
"ColumnName":"Contact",
"OriginalValue":"test_contact",
"NewValue":"test_contact"
},
{
"ColumnName":"Email",
"OriginalValue":"test_email",
"NewValue":"test_email2"
},
{
"ColumnName":"Name",
"OriginalValue":"test_name",
"NewValue":"test_name"
},
{
"ColumnName":"OfficeSector",
"OriginalValue":1,
"NewValue":1
},
{
"ColumnName":"PhoneNumber",
"OriginalValue":"test_phoneNumber",
"NewValue":"test_phoneNumber"
}
],
"ColumnValues":{
"Id":"40b5egc7-46ca-429b-86cb-3b0781d360c8",
"Address":"test_address",
"Contact":"test_contact",
"Email":"test_email2",
"Name":"test_name",
"OfficeSector":1,
"PhoneNumber":"test_phoneNumber"
},
"Valid":true
}
],
"Result":1,
"Success":true
}
}
我和我的团队有一个主要方面要实现: 能够创建管理员可以告诉的搜索页面
- 谁改变了
- 他们改变了什么
- 改变是什么时候发生的
他们可以给一个时间段,来减少审计记录的数量,有趣的部分来了: 应该有一个输入文本字段,让他们可以在“ColumnValues”部分的值中搜索。
我遇到的问题:
- 即使我将 Json 结构映射到关系行中,我也无法在保持通用性的情况下在每一列中进行搜索。
- 如果我不映射,我可以使用 LIKE mssql 函数在 Json 字符串中进行搜索,但是在大约 100,000 条记录的顺序上,查询需要很长时间才能完成,所以它可能不是顺便。
保持通用性很重要,因此我们不需要在每次创建或修改新实体时都修改审核搜索页面。
我只知道 MSSQL,但是将审计日志存储在像 cosmosDB 这样的面向文档的数据库(或其他任何数据库,这只是一个示例)中是否可以解决我的问题?或者我可以使用 MSSQL 等关系数据库达到所需的行为吗?
看来您是在征求意见,在这种情况下,我强烈推荐面向文档的数据库。
CosmosDB 可能是一个不错的选择,因为它支持 SQL 查询。
有一个扩展可以从 Audit.NET 登录到 CosmosDB:Audit.AzureCosmos
示例查询:
SELECT c.EventType, e.Table, e.Action, ch.ColumnName, ch.OriginalValue, ch.NewValue
FROM c
JOIN e IN c.EntityFrameworkEvent.Entries
JOIN ch IN e.Changes
WHERE ch.ColumnName = "Address" AND ch.OriginalValue = "test_address"
Here 是一个很好的 post,在 CosmosDB
上有很多复杂 SQL 查询的例子