使用.NetCore自带的后台作业,出入队简单模拟生产者消费者处理请求响应的数据
环境:Core:3.1的项目
说明:由于该方案为个人测试项目,重启时队列中的部分数据很可能会丢失,
对数据有要求的该方案不适用,不能照搬需要持久化处理,
另外发布到Linux Docker中通常不会自动回收,但是发布到IIS中需要简单设置不回收即可!!! 如下截图:
在IIS中找到这个站点所用的程序池,点击 高级设置。。。 回收——固定时间间隔 修改为 0
回收——虚拟/专用内存限制 修改为 0
进程模型——闲置超时 修改为 0
1:先来看效果
1.1:操作日志数据到表

1.2:操作日志数据到文件

2:过滤器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Filters;
using System.Text;
using System.Diagnostics;
using QzjcService.Models.Dto.LogModels;
using QzjcService.Controllers;
using SqlSugar.IOC;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using QzjcService.Helper;
using Microsoft.AspNetCore.Mvc;
using QzjcService.Models; namespace QzjcService.Filters
{
public class ActionNewLogFilter : ActionFilterAttribute
{
private static Stopwatch _watting = new Stopwatch();
public static double? longtime = 0;
private ActionLogModel log = new ActionLogModel();
private readonly ILogger<ActionNewLogFilter> _logger; public ActionNewLogFilter(ILogger<ActionNewLogFilter> logger)
{
_logger = logger;
} public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
_watting.Start();
string controllerName = context.ActionDescriptor.RouteValues["controller"];
string actionName = context.ActionDescriptor.RouteValues["action"];
string method = context.HttpContext.Request.Method;//请求方式
string queryString = context.HttpContext.Request.QueryString.Value;//地址参数
string argments = JsonConvert.SerializeObject(context.ActionArguments);
string url = context.HttpContext.Request.Host + context.HttpContext.Request.Path;//接口地址
var logStr = string.Format("\r\n【接口地址】:{0} \r\n【请求方式】:{1} \r\n【地址参数】:{2} \r\n【Body参数】:{3}", new object[] { url, method, queryString, argments });
log.ControllerName = controllerName;
log.ActionName = actionName; //请求方式 0:get, 1:Post
log.Menthod = (method.Equals("get", StringComparison.InvariantCultureIgnoreCase) || method.Equals("httpget", StringComparison.InvariantCultureIgnoreCase)) ? 0 : 1;
log.CreateTime = DateTime.Now;
log.RequstParms = logStr;
var _context = context.HttpContext;
if (_context != null)
{
var tokenStr = context.HttpContext.Request.Headers[ConstData.Authorization].ToString();
log.userId = string.IsNullOrEmpty(tokenStr) ? 0 : TokenHelper.GetUserModel(context.HttpContext)?.UserId;
}
await base.OnActionExecutionAsync(context, next);
}
public override async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
{
_watting.Stop();
longtime = 0;
if (context.Result is ObjectResult result)
{
if (result != null)
log.ResposeParam = JsonConvert.SerializeObject(result.Value);
}
longtime = _watting.Elapsed.TotalMilliseconds;
log.LongTimeMs = longtime.Value;
_watting.Reset();
log.RequstParms += "\r\n【响应参数】:" + log.ResposeParam + "\r\n============================================";
_logger.LogCritical(log.RequstParms);
// await DbScoped.Sugar.Insertable<ActionLogModel>(log).ExecuteCommandAsync();
await LogQueueHelper.EnQueueLogAsync(log);
await base.OnResultExecutionAsync(context, next);
} }
}
3:后台自带的定时器
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using QzjcService.Helper;
using QzjcService.Models.Dto.LogModels;
using SqlSugar.IOC;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace QzjcService.Services
{
public class LogTimeService : BackgroundService
{
private readonly ILogger<LogTimeService> _logger;
public LogTimeService(ILogger<LogTimeService> logger )
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await Task.Factory.StartNew(async () =>
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
var model = await LogQueueHelper.DeQueueLogAsync();
if (model != null)
{
Console.WriteLine($"===={DateTime.Now}=LogTimeService=DeQueueLog Success====");
await DbScoped.Sugar.Insertable<ActionLogModel>(model).ExecuteCommandAsync();
}
await Task.Delay(3000);
}
catch (Exception ex)
{
_logger.LogError($"====={DateTime.Now}===LogTimeService异常:=={ex.Message}==========");
continue;
}
}
}); }
}
}
4:Log记录Model
using SqlSugar;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;
namespace QzjcService.Models.Dto.LogModels
{
[Table("qzjc_action_loginfos")]
[SugarTable("qzjc_action_loginfos")]
public class ActionLogModel
{
/// <summary>
///
/// </summary>
[Column("id")]
[SugarColumn(ColumnName = "id")]
public int id { get; set; } /// <summary>
///
/// </summary>
[Column("controller_name")]
[SugarColumn(ColumnName = "controller_name")]
public string ControllerName { get; set; } /// <summary>
///
/// </summary>
[Column("action_name")]
[SugarColumn(ColumnName = "action_name")]
public string ActionName { get; set; } /// <summary>
///
/// </summary>
[Column("request_parms")]
[SugarColumn(ColumnName = "request_parms")]
public string RequstParms { get; set; } /// <summary>
///
/// </summary>
[Column("long_time")]
[SugarColumn(ColumnName = "long_time")]
public double LongTimeMs { get; set; } /// <summary>
///
/// </summary>
[Column("create_time")]
[SugarColumn(ColumnName = "create_time")]
public DateTime CreateTime { get; set; } /// <summary>
///
/// </summary>
[Column("create_userid")]
[SugarColumn(ColumnName = "create_userid")]
public int? userId { get; set; } [Column("menthod")]
[SugarColumn(ColumnName ="")]
public int? Menthod { get; set; } //[Column("state")]
//[SugarColumn(ColumnName = "state")]
//public int? State { get; set; } [Column("respose_parms")]
[SugarColumn(ColumnName = "respose_parms")]
public string ResposeParam { get; set; }
}
}
5:这里也贴出Serilog相关code
using System;
using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Configuration;
using Serilog;
using Serilog.Events; namespace QzjcService
{
public class Program
{
public static void Main(string[] args)
{
string dataTime = DateTime.Now.ToString("yyyy-MM-dd");//这里去掉更好,让其自增长
string fileStr = $"Logs/{dataTime}_logs.txt";
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Warning() //Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.MinimumLevel.Override("System", LogEventLevel.Warning)
.MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning)
.Enrich.FromLogContext()
.WriteTo.Async(c => c.File(fileStr, rollOnFileSizeLimit: true, fileSizeLimitBytes: 1024 * 1024 * 10, retainedFileCountLimit: 30))
.CreateLogger();
try
{
Log.Information("=========Starting web host==========");
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly!");
}
finally
{
Log.CloseAndFlush();
}
} public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging((hostingContext, builder) =>
{
builder.ClearProviders();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(c => { c.Limits.MaxRequestBodySize = 1024 * 1024 * 300; });
webBuilder.UseUrls("http://*:4444");
webBuilder.UseStartup<Startup>();
})
.UseSerilog();
}
}
<PackageReference Include="Serilog.Extensions.Hosting" Version="3.1.0" />
<PackageReference Include="Serilog.Sinks.Async" Version="1.4.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
<PackageReference Include="Serilog.Sinks.Elasticsearch" Version="8.2.0" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
使用.NetCore自带的后台作业,出入队简单模拟生产者消费者处理请求响应的数据的更多相关文章
- Python推导式详解,带你写出比较精简酷炫的代码
Python推导式详解,带你写出比较精简酷炫的代码 前言 1.推导式分类与用法 1.1 列表推导 1.2 集合推导 1.3 字典推导 1.4 元组推导?不存在的 2.推导式的性能 2.1 列表推导式与 ...
- 【Javascript Demo】遮罩层和百度地图弹出层简单实现
其实想做的就是显示百度地图的弹出层,现在已经简单实现了.示例和代码如下,点击按钮可以看到效果: 1.示例: 2.代码: <!DOCTYPE html PUBLIC "-//W3C/ ...
- 【Javascript Demo】遮罩层和弹出层简单实现
最近纠结于遮罩层和弹出层的实现,终于搞定了个简单的版本.示例和代码如下,点击按钮可以看到效果: 1.示例: 2.代码: <!DOCTYPE html PUBLIC "-//W3C//D ...
- 在使用Ajax请求返回json数据的时候IE浏览器弹出下载保存对话框的解决方法
在使用Ajax请求返回json数据的时候IE浏览器弹出下载保存对话框的解决方法 最近在做一个小东西,使用kindeditor上传图片的时候,自己写了一个上传的方法,按照协议规则通过ajax返回json ...
- PDO 拿出來的 Float 數據跟数据库中的数据不匹配
数据库中的价格字段是 float 类型的,在 Laravel 中取出会出现这样的情况 数据库:71.9 -> 程序打印:72.0 数据库:75.2 -> 程序打印:75.3 在另外一个测试 ...
- 【452】pandas筛选出表中满足另一个表所有条件的数据
参考:pandas筛选出表中满足另一个表所有条件的数据 参考:pandas:匹配两个dataframe 使用 pd.merge 来实现 on 表示查询的 columns,如果都有 id,那么这是很好的 ...
- C语言:将带头节点的单向链表结点域中的数据从小到大排序。-求出单向链表结点(不包括头节点)数据域中的最大值。-将M*N的二维数组中的数据,按行依次放入一维数组,
//函数fun功能是将带头节点的单向链表结点域中的数据从小到大排序. //相当于数组的冒泡排序. #include <stdio.h> #include <stdlib.h> ...
- 终于等到你!MobileTest免费公测,华为带你走出安卓适配大坑
一.安卓适配之痛真的无解吗? Android平台的诞生对智能手机的普及功不可没,但设备繁多.品牌众多.版本各异,芯片.摄像头.分辨率不统一等等,这些都逐渐成为Android系统发展的障碍,碎片化严重不 ...
- 利用ASP.netCore自带DI(DependencyInjection)实现批量依赖注入
ASP.net Core自带DI(依赖注入),用法如下: services.AddScoped(typeof(IProductService), typeof(ProductService)); 如果 ...
随机推荐
- Java学习day22
今天跟着视频学习了JScroll面板,图片按钮以及单多选框 这是一个图片按钮程序 很多网站还有软件的图标兼容按钮的功能,如果只有button是无法实现该功能的这时候就需要使用到图标按钮 文本框没有办法 ...
- android软件简约记账app开发day03-自定义键盘的书写
android软件简约记账app开发day03-自定义键盘的书写 我们在fragment界面使用了自定义的keybroad键盘,所以今天我们来书写自定义的键盘代码 新建util包,新建keyboard ...
- git 将本地文件推送到远程分支的分支
1. 新建文件夹复制远程分支 2. 切换到远程分支 3. 推送到远程 添加到暂存区,先运行 " git add . " 查看文件状态 在运 ...
- FreeRTOS --(6)内存管理 heap5
转载自https://blog.csdn.net/zhoutaopower/article/details/106748308 FreeRTOS 中的 heap 5 内存管理,相对于 heap 4&l ...
- 《转载》python/人工智能/Tensorflow/自然语言处理/计算机视觉/机器学习学习资源分享
本次分享一部分python/人工智能/Tensorflow/自然语言处理/计算机视觉/机器学习的学习资源,也是一些比较基础的,如果大家有看过网易云课堂的吴恩达的入门课程,在看这些视频还是一个很不错的提 ...
- Linux-编译安装http-实验
准备工作 1.关闭防火墙和SELinux 2.基础安装的系统,安装以下命令 yum install gcc make autoconf gcc-c++ glibc glibc-devel pcre p ...
- 不再空谈AI,从打造一台智能无人机开始
对于大多数无人机爱好者来说,能自己从头开始组装一台无人机,之后加入AI算法,能够航拍,可以目标跟踪,是心中的梦想. 并且,亲自从零开始完成复杂系统,这是掌握核心技术的必经之路. 开课吧特邀北京航空航天 ...
- 【Azure Developer】使用 Microsoft Authentication Libraries (MSAL) 如何来获取Token呢 (通过用户名和密码方式获取Access Token)
问题描述 在上一篇博文<[Azure Developer]使用 adal4j(Azure Active Directory authentication library for Java)如何来 ...
- 以rem为单位,数值较小,border-radius:50%部分浏览器渲染不圆方法
元素使用rem做单位且较小时,对于border-radius:50%在部分浏览器不圆解决方法: 1.将原来宽高扩大至两倍(.1rem --> .2rem),再使用transform:scale( ...
- Ubuntu16.04编译OpenJDK7u40
下图是OpenJDK6.OpenJDK7.OpenJDK7u和OpenJDK8这几个项目之间的关系: 下面把编译步骤记录下来: 编译环境 Ubuntu 16.04.4 LTS jdk版本 openjd ...