!33 增加功能:增加数据库脚本执行日志

Merge pull request !33 from Argo/dev-DBLog
This commit is contained in:
Argo 2019-09-23 17:27:05 +08:00 committed by Gitee
commit c580e1eb6d
22 changed files with 420 additions and 14 deletions

View File

@ -635,6 +635,18 @@
"IsResource": NumberInt(0),
"Application": "0"
},
{
"_id": ObjectId("5bd9b3d868aa001661776f60"),
"ParentId": "5bd7b8445fa31256f77e4b9c",
"Name": "SQL日志",
"Order": NumberInt(40),
"Icon": "fa fa-database",
"Url": "~/Admin/SQL",
"Category": "0",
"Target": "_self",
"IsResource": NumberInt(0),
"Application": "0"
},
{
"_id": ObjectId("5bd7b8445fa31256f77e4b89"),
"ParentId": "0",

View File

@ -112,6 +112,7 @@ INSERT INTO Navigations (ParentId, Name, `Order`, Icon, Url, Category) VALUES (0
INSERT INTO Navigations (ParentId, Name, `Order`, Icon, Url, Category) VALUES (@@identity, '操作日志', 10, 'fa fa-edit', '~/Admin/Logs', '0');
INSERT INTO Navigations (ParentId, Name, `Order`, Icon, Url, Category) VALUES (@@identity - 1, '登录日志', 20, 'fa fa-user-circle-o', '~/Admin/Logins', '0');
INSERT INTO Navigations (ParentId, Name, `Order`, Icon, Url, Category) VALUES (@@identity - 2, '访问日志', 30, 'fa fa-bars', '~/Admin/Traces', '0');
INSERT INTO Navigations (ParentId, Name, `Order`, Icon, Url, Category) VALUES (@@identity - 3, 'SQL日志', 40, 'fa fa-database', '~/Admin/SQL', '0');
INSERT INTO Navigations (ParentId, Name, `Order`, Icon, Url, Category) VALUES (0, '在线用户', 140, 'fa fa-users', '~/Admin/Online', '0');
INSERT INTO Navigations (ParentId, Name, `Order`, Icon, Url, Category) VALUES (0, '网站分析', 145, 'fa fa-line-chart', '~/Admin/Analyse', '0');
INSERT INTO Navigations (ParentId, Name, `Order`, Icon, Url, Category) VALUES (0, '程序异常', 150, 'fa fa-cubes', '~/Admin/Exceptions', '0');

View File

@ -182,4 +182,11 @@ CREATE TABLE Traces(
City VARCHAR (50),
RequestUrl VARCHAR (500) NOT NULL,
UserAgent VARCHAR (2000) NULL
);
);
CREATE TABLE DBLogs (
ID INTEGER PRIMARY KEY Auto_increment,
UserName VARCHAR (50) NULL,
SQL VARCHAR NOT NULL,
LogTime DATETIME NOT NULL
);

View File

@ -112,6 +112,7 @@ INSERT INTO Navigations (ParentId, Name, "order", Icon, Url, Category) VALUES (0
INSERT INTO Navigations (ParentId, Name, "order", Icon, Url, Category) VALUES (currval('navigations_id_seq') - 1, 0, '操作日志', 10, 'fa fa-edit', '~/Admin/Logs', '0');
INSERT INTO Navigations (ParentId, Name, "order", Icon, Url, Category) VALUES (currval('navigations_id_seq') - 2, 0, '登录日志', 20, 'fa fa-user-circle-o', '~/Admin/Logins', '0');
INSERT INTO Navigations (ParentId, Name, "order", Icon, Url, Category) VALUES (currval('navigations_id_seq') - 3, 0, '访问日志', 30, 'fa fa-bars', '~/Admin/Traces', '0');
INSERT INTO Navigations (ParentId, Name, "order", Icon, Url, Category) VALUES (currval('navigations_id_seq') - 4, 0, 'SQL日志', 40, 'fa fa-database', '~/Admin/SQL', '0');
INSERT INTO Navigations (ParentId, Name, "order", Icon, Url, Category) VALUES (0, '在线用户', 140, 'fa fa-users', '~/Admin/Online', '0');
INSERT INTO Navigations (ParentId, Name, "order", Icon, Url, Category) VALUES (0, '网站分析', 145, 'fa fa-line-chart', '~/Admin/Analyse', '0');
INSERT INTO Navigations (ParentId, Name, "order", Icon, Url, Category) VALUES (0, '程序异常', 150, 'fa fa-cubes', '~/Admin/Exceptions', '0');

View File

@ -182,4 +182,11 @@ CREATE TABLE Traces(
City VARCHAR (50),
RequestUrl VARCHAR (500) NOT NULL,
UserAgent VARCHAR (2000) NULL
);
);
CREATE TABLE DBLogs (
ID SERIAL PRIMARY KEY,
UserName VARCHAR (50) NULL,
SQL VARCHAR (2000) NOT NULL,
LogTime DATE NOT NULL
);

View File

@ -112,6 +112,7 @@ INSERT INTO [Navigations] ([ParentId], [Name], [Order], [Icon], [Url], [Category
INSERT INTO [Navigations] ([ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (last_insert_rowid(), '操作日志', 10, 'fa fa-edit', '~/Admin/Logs', '0');
INSERT INTO [Navigations] ([ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (last_insert_rowid() - 1, '登录日志', 20, 'fa fa-user-circle-o', '~/Admin/Logins', '0');
INSERT INTO [Navigations] ([ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (last_insert_rowid() - 2, '访问日志', 30, 'fa fa-bars', '~/Admin/Traces', '0');
INSERT INTO [Navigations] ([ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (last_insert_rowid() - 3, 'SQL日志', 40, 'fa fa-database', '~/Admin/SQL', '0');
INSERT INTO [Navigations] ([ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (0, '在线用户', 140, 'fa fa-users', '~/Admin/Online', '0');
INSERT INTO [Navigations] ([ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (0, '网站分析', 145, 'fa fa-line-chart', '~/Admin/Analyse', '0');
INSERT INTO [Navigations] ([ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (0, '程序异常', 150, 'fa fa-cubes', '~/Admin/Exceptions', '0');

View File

@ -182,4 +182,11 @@ CREATE TABLE Traces(
City VARCHAR (50),
RequestUrl VARCHAR (500) NOT NULL,
UserAgent VARCHAR (2000)
);
CREATE TABLE DBLogs (
ID INTEGER PRIMARY KEY,
UserName VARCHAR (50) COLLATE NOCASE,
SQL VARCHAR NOT NULL,
LogTime DATETIME NOT NULL
);

View File

@ -115,6 +115,7 @@ INSERT INTO [Navigations] ([ParentId], [Name], [Order], [Icon], [Url], [Category
INSERT INTO [Navigations] ([ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (@@Identity, N'操作日志', 10, N'fa fa-edit', N'~/Admin/Logs', N'0')
INSERT INTO [Navigations] ([ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (@@Identity - 1, N'登录日志', 20, N'fa fa-user-circle-o', N'~/Admin/Logins', N'0')
INSERT INTO [Navigations] ([ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (@@Identity - 2, N'访问日志', 30, N'fa fa-bars', N'~/Admin/Traces', N'0')
INSERT INTO [Navigations] ([ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (@@Identity - 3, N'SQL日志', 40, N'fa fa-database', N'~/Admin/SQL', N'0')
INSERT INTO [Navigations] ([ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (0, N'在线用户', 140, N'fa fa-users', N'~/Admin/Online', N'0')
INSERT INTO [Navigations] ([ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (0, N'网站分析', 145, N'fa fa-line-chart', N'~/Admin/Analyse', N'0')
INSERT INTO [Navigations] ([ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (0, N'程序异常', 150, N'fa fa-cubes', N'~/Admin/Exceptions', N'0')

View File

@ -577,4 +577,30 @@ CREATE TABLE [dbo].[Traces](
GO
SET ANSI_PADDING OFF
GO
GO
/****** Object: Table [dbo].[DBLogs] Script Date: 09/22/2019 22:06:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[DBLogs](
[ID] [int] IDENTITY(1,1) NOT NULL,
[UserName] [varchar](50) NULL,
[SQL] [nvarchar](max) NOT NULL,
[LogTime] [datetime] NOT NULL,
CONSTRAINT [PK_DBLogs] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO

View File

@ -53,6 +53,12 @@ namespace Bootstrap.Admin.Controllers
/// <returns></returns>
public ActionResult Logs() => View(new NavigatorBarModel(this));
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult SQL() => View(new NavigatorBarModel(this));
/// <summary>
///
/// </summary>

View File

@ -0,0 +1,26 @@
using Bootstrap.Admin.Query;
using Bootstrap.DataAccess;
using Longbow.Web.Mvc;
using Microsoft.AspNetCore.Mvc;
namespace Bootstrap.Admin.Controllers.Api
{
/// <summary>
/// SQL 语句执行日志 webapi
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class SQLController : ControllerBase
{
/// <summary>
/// 获取执行日志数据
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
[HttpGet]
public QueryData<DBLog> Get([FromQuery]QuerySQLOption value)
{
return value.RetrieveData();
}
}
}

View File

@ -0,0 +1,40 @@
using Bootstrap.DataAccess;
using Longbow.Web.Mvc;
using System;
namespace Bootstrap.Admin.Query
{
/// <summary>
/// SQL执行查询配置类
/// </summary>
public class QuerySQLOption : PaginationOption
{
/// <summary>
/// 获得/设置 用户登录名
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 获得/设置 开始时间
/// </summary>
public DateTime? OperateTimeStart { get; set; }
/// <summary>
/// 获得/设置 结束时间
/// </summary>
public DateTime? OperateTimeEnd { get; set; }
/// <summary>
/// 查询数据方法
/// </summary>
/// <returns></returns>
public QueryData<DBLog> RetrieveData()
{
var data = LogHelper.RetrieveDBLogs(this, OperateTimeStart, OperateTimeEnd, UserName);
var ret = new QueryData<DBLog>();
ret.total = data.TotalItems;
ret.rows = data.Items;
return ret;
}
}
}

View File

@ -1,9 +1,10 @@
using Longbow.Tasks;
using Bootstrap.DataAccess;
using Longbow.Tasks;
using Microsoft.Extensions.Hosting;
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Task = System.Threading.Tasks.Task;
namespace Microsoft.Extensions.DependencyInjection
{
@ -49,6 +50,9 @@ namespace Microsoft.Extensions.DependencyInjection
// 创建任务并禁用
TaskServicesManager.GetOrAdd("禁用任务", token => Task.Delay(1000)).Status = SchedulerStatus.Disabled;
// 真实任务负责批次写入数据执行脚本到日志中
TaskServicesManager.GetOrAdd<LogHelper.DbLogTask>("SQL日志", TriggerBuilder.Build(Cron.Minutely()));
});
}
}

View File

@ -0,0 +1,80 @@
@model NavigatorBarModel
@{
ViewBag.Title = "SQL日志";
}
@section css {
<environment include="Development">
<link href="~/lib/datetimepicker/css//bootstrap-datetimepicker.css" rel="stylesheet" />
<link href="~/lib/bootstrap-table/bootstrap-table.css" rel="stylesheet" />
</environment>
<environment exclude="Development">
<link href="~/lib/datetimepicker/css//bootstrap-datetimepicker.min.css" rel="stylesheet" />
<link href="~/lib/bootstrap-table/bootstrap-table.min.css" rel="stylesheet" />
</environment>
}
@section javascript {
<environment include="Development">
<script src="~/lib/bootstrap-table/bootstrap-table.js"></script>
<script src="~/lib/bootstrap-table/extensions/export/bootstrap-table-export.js"></script>
<script src="~/lib/bootstrap-table/locale/bootstrap-table-zh-CN.js"></script>
<script src="~/lib/tablexport/tableExport.js"></script>
<script src="~/lib/datetimepicker/js/bootstrap-datetimepicker.js"></script>
</environment>
<environment exclude="Development">
<script src="~/lib/bootstrap-table/bootstrap-table.min.js"></script>
<script src="~/lib/bootstrap-table/extensions/export/bootstrap-table-export.min.js"></script>
<script src="~/lib/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
<script src="~/lib/tablexport/tableExport.min.js"></script>
<script src="~/lib/datetimepicker/js/bootstrap-datetimepicker.min.js"></script>
</environment>
<script src="~/lib/datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js"></script>
<script src="~/js/sql.js" asp-append-version="true"></script>
}
<div class="card">
<div class="card-header">查询条件</div>
<div class="card-body">
<form class="form-inline">
<div class="row">
<div class="form-group col-sm-6 col-lg-auto">
<label class="control-label" for="txt_operate_start">起始时间</label>
<div class="input-group date">
<input id="txt_operate_start" class="form-control" size="16" type="text" value="@DateTime.Today.ToString("yyyy-MM-dd")" readonly>
<div class="input-group-append input-group-addon">
<div class="input-group-text"><span class="fa fa-times"></span></div>
</div>
<div class="input-group-append input-group-addon">
<div class="input-group-text"><span class="fa fa-calendar"></span></div>
</div>
</div>
</div>
<div class="form-group col-sm-6 col-lg-auto">
<label class="control-label" for="txt_operate_end">终止时间</label>
<div class="input-group date">
<input id="txt_operate_end" class="form-control" size="16" type="text" value="" readonly>
<div class="input-group-append input-group-addon">
<div class="input-group-text"><span class="fa fa-times"></span></div>
</div>
<div class="input-group-append input-group-addon">
<div class="input-group-text"><span class="fa fa-calendar"></span></div>
</div>
</div>
</div>
<div class="form-group col-sm-6 col-lg-auto">
<label class="control-label" for="txt_username">登录用户</label>
<input type="text" class="form-control" id="txt_username" />
</div>
<div class="form-group col-sm-6 col-lg-auto flex-sm-fill justify-content-sm-end align-self-sm-end">
<button type="button" id="btn_query" class="btn btn-primary btn-fill"><i class="fa fa-search" aria-hidden="true"></i><span>查询</span></button>
</div>
</div>
</form>
</div>
</div>
<div class="card">
<div class="card-header">
查询结果
</div>
<div class="card-body">
<table></table>
</div>
</div>

View File

@ -0,0 +1,18 @@
$(function () {
var url = 'api/SQL';
$('.card-body table').smartTable({
url: url,
sortName: 'LogTime',
sortOrder: 'desc',
queryParams: function (params) { return $.extend(params, { UserName: $("#txt_username").val(), OperateTimeStart: $("#txt_operate_start").val(), OperateTimeEnd: $("#txt_operate_end").val() }); },
columns: [
{ title: "所属用户", field: "UserName", sortable: true },
{ title: "执行时间", field: "LogTime", sortable: true },
{ title: "脚本内容", field: "SQL", sortable: false }
],
exportOptions: {
fileName: "SQL日志数据"
}
});
});

View File

@ -0,0 +1,15 @@
namespace Bootstrap.DataAccess.MongoDB
{
/// <summary>
/// DBLog 实体类
/// </summary>
public class DBLog : DataAccess.DBLog
{
/// <summary>
/// 保存数据库脚本日志方法 MongoDB 无脚本
/// </summary>
/// <param name="p"></param>
/// <returns></returns>
public override bool Save(DataAccess.DBLog p) => true;
}
}

View File

@ -8,12 +8,12 @@ using System.Linq;
namespace Bootstrap.DataAccess.MongoDB
{
/// <summary>
///
/// 操作日志实体类
/// </summary>
public class Log : DataAccess.Log
{
/// <summary>
///
/// 分页查询操作日志
/// </summary>
/// <param name="po"></param>
/// <param name="startTime"></param>
@ -64,7 +64,7 @@ namespace Bootstrap.DataAccess.MongoDB
}
/// <summary>
///
/// 查询所有操作日志
/// </summary>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
@ -89,7 +89,7 @@ namespace Bootstrap.DataAccess.MongoDB
private static void DeleteLogAsync() => System.Threading.Tasks.Task.Run(() => DbManager.Logs.DeleteMany(log => log.LogTime < DateTime.Now.AddDays(-7)));
/// <summary>
///
/// 保存操作日志
/// </summary>
/// <param name="log"></param>
/// <returns></returns>

View File

@ -7,12 +7,13 @@
<ItemGroup>
<PackageReference Include="Bootstrap.Security.DataAccess" Version="2.2.21" />
<PackageReference Include="Longbow.Configuration" Version="2.2.7" />
<PackageReference Include="Longbow.Data" Version="2.3.7" />
<PackageReference Include="Longbow.Data" Version="2.3.8-beta" />
<PackageReference Include="Longbow.GiteeAuth" Version="2.2.0" />
<PackageReference Include="Longbow.GitHubAuth" Version="2.2.0" />
<PackageReference Include="Longbow.Logging" Version="2.2.13" />
<PackageReference Include="Longbow.PetaPoco" Version="1.0.2" />
<PackageReference Include="Longbow.Security.Cryptography" Version="1.3.0" />
<PackageReference Include="Longbow.Tasks" Version="2.2.23" />
<PackageReference Include="Longbow.Web" Version="2.2.16" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="2.2.6" />
<PackageReference Include="PetaPoco.Extensions" Version="1.0.9" />

View File

@ -0,0 +1,79 @@
using Longbow.Web.Mvc;
using PetaPoco;
using System;
namespace Bootstrap.DataAccess
{
/// <summary>
/// 后台数据库脚本执行日志实体类
/// </summary>
[TableName("DBLogs")]
public class DBLog
{
/// <summary>
/// 获得/设置 主键ID
/// </summary>
public string Id { get; set; }
/// <summary>
/// 获得/设置 当前登陆名
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 获得/设置 数据库执行脚本
/// </summary>
public string SQL { get; set; }
/// <summary>
/// 获取/设置 用户角色关联状态 checked 标示已经关联 '' 标示未关联
/// </summary>
public DateTime LogTime { get; set; }
/// <summary>
/// 查询所有SQL日志信息
/// </summary>
/// <param name="po"></param>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <param name="userName"></param>
/// <returns></returns>
public virtual Page<DBLog> RetrievePages(PaginationOption po, DateTime? startTime, DateTime? endTime, string userName)
{
var sql = new Sql("select * from DBLogs");
if (startTime.HasValue) sql.Where("LogTime >= @0", startTime.Value);
if (endTime.HasValue) sql.Where("LogTime < @0", endTime.Value.AddDays(1).AddSeconds(-1));
if (startTime == null && endTime == null) sql.Where("LogTime > @0", DateTime.Today.AddMonths(0 - DictHelper.RetrieveExceptionsLogPeriod()));
if (!string.IsNullOrEmpty(userName)) sql.Where("UserName = @0", userName);
sql.OrderBy($"{po.Sort} {po.Order}");
return DbManager.Create().Page<DBLog>(po.PageIndex, po.Limit, sql);
}
/// <summary>
/// 删除日志信息
/// </summary>
/// <returns></returns>
private static void DeleteLogAsync()
{
System.Threading.Tasks.Task.Run(() =>
{
var dtm = DateTime.Now.AddMonths(0 - DictHelper.RetrieveLogsPeriod());
DbManager.Create().Execute("delete from DBLogs where LogTime < @0", dtm);
});
}
/// <summary>
/// 保存新增的日志信息
/// </summary>
/// <param name="p"></param>
/// <returns></returns>
public virtual bool Save(DBLog p)
{
if (p == null) throw new ArgumentNullException(nameof(p));
DeleteLogAsync();
DbManager.Create(enableLog: false).Save(p);
return true;
}
}
}

View File

@ -1,4 +1,9 @@
using PetaPoco;
using Longbow.Data;
using Longbow.Web;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using PetaPoco;
using System;
using System.Collections.Specialized;
@ -14,12 +19,28 @@ namespace Bootstrap.DataAccess
/// </summary>
/// <param name="connectionName"></param>
/// <param name="keepAlive"></param>
/// <param name="log">是否记录日志</param>
/// <returns></returns>
public static IDatabase Create(string connectionName = null, bool keepAlive = false)
public static IDatabase Create(string connectionName = null, bool keepAlive = false, bool enableLog = true)
{
if (Mappers.GetMapper(typeof(Exceptions), null) == null) Mappers.Register(typeof(Exceptions).Assembly, new BootstrapDataAccessConventionMapper());
var db = Longbow.Data.DbManager.Create(connectionName, keepAlive);
db.ExceptionThrown += (sender, args) => args.Exception.Log(new NameValueCollection() { ["LastCmd"] = db.LastCommand });
if (enableLog)
{
db.OnCommandExecuted(async provider =>
{
var context = provider.GetRequiredService<IHttpContextAccessor>();
var userName = context.HttpContext?.User.Identity.Name;
var log = new DBLog()
{
LogTime = DateTime.Now,
SQL = db.LastCommand,
UserName = userName
};
await LogHelper.AddDBLog(log).ConfigureAwait(false);
});
}
return db;
}
}

View File

@ -1,12 +1,15 @@
using Longbow.Web.Mvc;
using Longbow.Tasks;
using Longbow.Web.Mvc;
using PetaPoco;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading;
namespace Bootstrap.DataAccess
{
/// <summary>
///
/// 操作日志相关操作类
/// </summary>
public static class LogHelper
{
@ -36,5 +39,55 @@ namespace Bootstrap.DataAccess
log.LogTime = DateTime.Now;
return DbContextManager.Create<Log>().Save(log);
}
#region
private static BlockingCollection<DBLog> _messageQueue = new BlockingCollection<DBLog>(new ConcurrentQueue<DBLog>());
/// <summary>
/// 添加数据库日志实体类到内部集合中
/// </summary>
/// <param name="log"></param>
public static System.Threading.Tasks.Task AddDBLog(DBLog log) => System.Threading.Tasks.Task.Run(() =>
{
if (!_messageQueue.IsAddingCompleted)
{
_messageQueue.Add(log);
}
});
/// <summary>
/// 查询所有SQL日志信息
/// </summary>
/// <param name="op"></param>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <param name="userName"></param>
/// <returns></returns>
public static Page<DBLog> RetrieveDBLogs(PaginationOption op, DateTime? startTime, DateTime? endTime, string userName) => DbContextManager.Create<DBLog>().RetrievePages(op, startTime, endTime, userName);
/// <summary>
/// 数据库脚本执行日志任务实体类
/// </summary>
public class DbLogTask : ITask
{
/// <summary>
/// 任务执行方法
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public System.Threading.Tasks.Task Execute(CancellationToken cancellationToken)
{
var logs = new List<DBLog>();
while (_messageQueue.TryTake(out var log))
{
logs.Add(log);
};
using (var db = DbManager.Create(enableLog: false))
{
db.InsertBatch(logs);
}
return System.Threading.Tasks.Task.CompletedTask;
}
}
#endregion
}
}