feat:add access trend log qurtz

This commit is contained in:
anjoy8 2021-09-16 11:26:00 +08:00
parent c7f0ca3a6e
commit b2dbd11f71
6 changed files with 261 additions and 2 deletions

View File

@ -165,6 +165,56 @@
返回数据集合 返回数据集合
</summary> </summary>
</member> </member>
<member name="T:Blog.Core.Model.Models.AccessTrendLog">
<summary>
用户访问趋势日志
</summary>
</member>
<member name="P:Blog.Core.Model.Models.AccessTrendLog.User">
<summary>
</summary>
</member>
<member name="P:Blog.Core.Model.Models.AccessTrendLog.IP">
<summary>
</summary>
</member>
<member name="P:Blog.Core.Model.Models.AccessTrendLog.API">
<summary>
</summary>
</member>
<member name="P:Blog.Core.Model.Models.AccessTrendLog.BeginTime">
<summary>
</summary>
</member>
<member name="P:Blog.Core.Model.Models.AccessTrendLog.OPTime">
<summary>
</summary>
</member>
<member name="P:Blog.Core.Model.Models.AccessTrendLog.RequestMethod">
<summary>
</summary>
</member>
<member name="P:Blog.Core.Model.Models.AccessTrendLog.RequestData">
<summary>
</summary>
</member>
<member name="P:Blog.Core.Model.Models.AccessTrendLog.Agent">
<summary>
</summary>
</member>
<member name="P:Blog.Core.Model.Models.AccessTrendLog.Createdate">
<summary>
创建时间
</summary>
</member>
<member name="P:Blog.Core.Model.Models.Advertisement.ImgUrl"> <member name="P:Blog.Core.Model.Models.Advertisement.ImgUrl">
<summary> <summary>
广告图片 广告图片

View File

@ -82,7 +82,7 @@ namespace Blog.Core.Common.LogHelper
/// <param name="encode">编码</param> /// <param name="encode">编码</param>
/// <param name="readType">读取类型(0:精准,1:前缀模糊)</param> /// <param name="readType">读取类型(0:精准,1:前缀模糊)</param>
/// <returns></returns> /// <returns></returns>
public static string ReadLog(string folderPath, string fileName, Encoding encode, ReadType readType = ReadType.Accurate) public static string ReadLog(string folderPath, string fileName, Encoding encode, ReadType readType = ReadType.Accurate, int takeOnlyTop = -1)
{ {
string s = ""; string s = "";
try try
@ -112,6 +112,8 @@ namespace Blog.Core.Common.LogHelper
var allFiles = new DirectoryInfo(folderPath); var allFiles = new DirectoryInfo(folderPath);
var selectFiles = allFiles.GetFiles().Where(fi => fi.Name.ToLower().Contains(fileName.ToLower())).ToList(); var selectFiles = allFiles.GetFiles().Where(fi => fi.Name.ToLower().Contains(fileName.ToLower())).ToList();
selectFiles = takeOnlyTop > 0 ? selectFiles.Take(takeOnlyTop).ToList() : selectFiles;
foreach (var item in selectFiles) foreach (var item in selectFiles)
{ {
if (File.Exists(item.FullName)) if (File.Exists(item.FullName))
@ -379,7 +381,7 @@ namespace Blog.Core.Common.LogHelper
try try
{ {
Logs = GetRequestInfo(ReadType.Prefix); Logs = GetRequestInfo(ReadType.Prefix);
apiDates = (from n in Logs apiDates = (from n in Logs
group n by new { n.Date } into g group n by new { n.Date } into g
select new ApiDate select new ApiDate

View File

@ -0,0 +1,14 @@
using Blog.Core.IServices.BASE;
using Blog.Core.Model.Models;
namespace Blog.Core.IServices
{
/// <summary>
/// IAccessTrendLogServices
/// </summary>
public interface IAccessTrendLogServices : IBaseServices<AccessTrendLog>
{
}
}

View File

@ -0,0 +1,57 @@
using SqlSugar;
using System;
namespace Blog.Core.Model.Models
{
/// <summary>
/// 用户访问趋势日志
/// </summary>
public class AccessTrendLog : RootEntityTkey<int>
{
/// <summary>
///
/// </summary>
[SugarColumn(Length = 128, IsNullable = true, ColumnDataType = "nvarchar")]
public string User { get; set; }
/// <summary>
///
/// </summary>
[SugarColumn(Length = 128, IsNullable = true, ColumnDataType = "nvarchar")]
public string IP { get; set; }
/// <summary>
///
/// </summary>
[SugarColumn(Length = 128, IsNullable = true, ColumnDataType = "nvarchar")]
public string API { get; set; }
/// <summary>
///
/// </summary>
[SugarColumn(Length = 128, IsNullable = true, ColumnDataType = "nvarchar")]
public string BeginTime { get; set; }
/// <summary>
///
/// </summary>
[SugarColumn(Length = 128, IsNullable = true, ColumnDataType = "nvarchar")]
public string OPTime { get; set; }
/// <summary>
///
/// </summary>
[SugarColumn(Length = 128, IsNullable = true, ColumnDataType = "nvarchar")]
public string RequestMethod { get; set; }
/// <summary>
///
/// </summary>
[SugarColumn(Length = 256, IsNullable = true, ColumnDataType = "nvarchar")]
public string RequestData { get; set; }
/// <summary>
///
/// </summary>
[SugarColumn(Length = 256, IsNullable = true, ColumnDataType = "nvarchar")]
public string Agent { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime Createdate { get; set; } = DateTime.Now;
}
}

View File

@ -0,0 +1,18 @@
using Blog.Core.IRepository.Base;
using Blog.Core.IServices;
using Blog.Core.Model.Models;
using Blog.Core.Services.BASE;
namespace Blog.Core.Services
{
public partial class AccessTrendLogServices : BaseServices<AccessTrendLog>, IAccessTrendLogServices
{
IBaseRepository<AccessTrendLog> _dal;
public AccessTrendLogServices(IBaseRepository<AccessTrendLog> dal)
{
this._dal = dal;
base.BaseDal = dal;
}
}
}

View File

@ -0,0 +1,118 @@
using Blog.Core.Common.LogHelper;
using Blog.Core.IServices;
using Blog.Core.Model.Models;
using Microsoft.AspNetCore.Hosting;
using Newtonsoft.Json;
using Quartz;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/// <summary>
/// 这里要注意下,命名空间和程序集是一样的,不然反射不到
/// </summary>
namespace Blog.Core.Tasks
{
public class Job_AccessTrendLog_Quartz : JobBase, IJob
{
private readonly IAccessTrendLogServices _accessTrendLogServices;
private readonly IWebHostEnvironment _environment;
public Job_AccessTrendLog_Quartz(IAccessTrendLogServices accessTrendLogServices, ITasksQzServices tasksQzServices, IWebHostEnvironment environment)
{
_accessTrendLogServices = accessTrendLogServices;
_environment = environment;
_tasksQzServices = tasksQzServices;
}
public async Task Execute(IJobExecutionContext context)
{
var executeLog = await ExecuteJob(context, async () => await Run(context));
}
public async Task Run(IJobExecutionContext context)
{
// 可以直接获取 JobDetail 的值
var jobKey = context.JobDetail.Key;
var jobId = jobKey.Name;
// 也可以通过数据库配置,获取传递过来的参数
JobDataMap data = context.JobDetail.JobDataMap;
var lastestLogDatetime = (await _accessTrendLogServices.Query(null, d => d.Createdate, false)).FirstOrDefault()?.Createdate;
if (lastestLogDatetime == null)
{
lastestLogDatetime = Convert.ToDateTime("2021-08-01");
}
var accLogs = GetAccessLogs().Where(d => d.BeginTime.ObjToDate() >= lastestLogDatetime).ToList();
var accTrendLogs = new List<AccessTrendLog>() { };
accLogs.ForEach(m =>
{
accTrendLogs.Add(new AccessTrendLog()
{
User = m.User,
API = m.API,
BeginTime = m.BeginTime,
Createdate = DateTime.Now,
IP = m.IP,
RequestMethod = m.RequestMethod?.Length > 50 ? m.RequestMethod.Substring(0, 50) : m.RequestMethod
});
});
if (accTrendLogs.Count > 0)
{
var logsIds = await _accessTrendLogServices.Add(accTrendLogs);
}
}
private List<UserAccessFromFIles> GetAccessLogs()
{
List<UserAccessFromFIles> userAccessModels = new();
var accessLogs = LogLock.ReadLog(
Path.Combine(_environment.ContentRootPath, "Log"), "RecordAccessLogs_", Encoding.UTF8, ReadType.Prefix
).ObjToString().TrimEnd(',');
try
{
return JsonConvert.DeserializeObject<List<UserAccessFromFIles>>("[" + accessLogs + "]");
}
catch (Exception)
{
var accLogArr = accessLogs.Split("\n");
foreach (var item in accLogArr)
{
if (item.ObjToString() != "")
{
try
{
var accItem = JsonConvert.DeserializeObject<UserAccessFromFIles>(item.TrimEnd(','));
userAccessModels.Add(accItem);
}
catch (Exception)
{
}
}
}
}
return userAccessModels;
}
}
public class UserAccessFromFIles
{
public string User { get; set; }
public string IP { get; set; }
public string API { get; set; }
public string BeginTime { get; set; }
public string OPTime { get; set; }
public string RequestMethod { get; set; } = "";
public string Agent { get; set; }
}
}