环境: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自带的后台作业,出入队简单模拟生产者消费者处理请求响应的数据的更多相关文章

  1. Python推导式详解,带你写出比较精简酷炫的代码

    Python推导式详解,带你写出比较精简酷炫的代码 前言 1.推导式分类与用法 1.1 列表推导 1.2 集合推导 1.3 字典推导 1.4 元组推导?不存在的 2.推导式的性能 2.1 列表推导式与 ...

  2. 【Javascript Demo】遮罩层和百度地图弹出层简单实现

    其实想做的就是显示百度地图的弹出层,现在已经简单实现了.示例和代码如下,点击按钮可以看到效果: 1.示例:   2.代码: <!DOCTYPE html PUBLIC "-//W3C/ ...

  3. 【Javascript Demo】遮罩层和弹出层简单实现

    最近纠结于遮罩层和弹出层的实现,终于搞定了个简单的版本.示例和代码如下,点击按钮可以看到效果: 1.示例: 2.代码: <!DOCTYPE html PUBLIC "-//W3C//D ...

  4. 在使用Ajax请求返回json数据的时候IE浏览器弹出下载保存对话框的解决方法

    在使用Ajax请求返回json数据的时候IE浏览器弹出下载保存对话框的解决方法 最近在做一个小东西,使用kindeditor上传图片的时候,自己写了一个上传的方法,按照协议规则通过ajax返回json ...

  5. PDO 拿出來的 Float 數據跟数据库中的数据不匹配

    数据库中的价格字段是 float 类型的,在 Laravel 中取出会出现这样的情况 数据库:71.9 -> 程序打印:72.0 数据库:75.2 -> 程序打印:75.3 在另外一个测试 ...

  6. 【452】pandas筛选出表中满足另一个表所有条件的数据

    参考:pandas筛选出表中满足另一个表所有条件的数据 参考:pandas:匹配两个dataframe 使用 pd.merge 来实现 on 表示查询的 columns,如果都有 id,那么这是很好的 ...

  7. C语言:将带头节点的单向链表结点域中的数据从小到大排序。-求出单向链表结点(不包括头节点)数据域中的最大值。-将M*N的二维数组中的数据,按行依次放入一维数组,

    //函数fun功能是将带头节点的单向链表结点域中的数据从小到大排序. //相当于数组的冒泡排序. #include <stdio.h> #include <stdlib.h> ...

  8. 终于等到你!MobileTest免费公测,华为带你走出安卓适配大坑

    一.安卓适配之痛真的无解吗? Android平台的诞生对智能手机的普及功不可没,但设备繁多.品牌众多.版本各异,芯片.摄像头.分辨率不统一等等,这些都逐渐成为Android系统发展的障碍,碎片化严重不 ...

  9. 利用ASP.netCore自带DI(DependencyInjection)实现批量依赖注入

    ASP.net Core自带DI(依赖注入),用法如下: services.AddScoped(typeof(IProductService), typeof(ProductService)); 如果 ...

随机推荐

  1. 记一次MySql重置root密码无效

    说起这个事情吧也相对来说比较尴尬,对于一个技术来说忘记密码然后找回密码都是相当简单的一个事情,但是在生产环境中没有保存记录只能是自己的失职,尴尬就尴尬在明明重置成功了却没有生效,弄得好几个工程师在哪里 ...

  2. 用Eclipse远程调试服务器tomcat

    BEGIN; 在做远程调试时,在windows系统和非windows系统下的配置,Tomcat中会有所差别,具体如下: 第一步.配置tomcat 一.在windows系统中: 打开�TALINE_HO ...

  3. 前台主页搭建、后台主页轮播图接口设计、跨域问题详解、前后端互通、后端自定义配置、git软件的初步介绍

    今日内容概要 前台主页 后台主页轮播图接口 跨域问题详解 前后端打通 后端自定义配置 git介绍和安装 内容详细 1.前台主页 Homeviwe.vue <template> <di ...

  4. 2022最新IntellJ IDEA的zheng开发部署文档

    目录 前景提示 一.环境整合 构建工具(参考工具部署方式) 二.git 导入编译器 三.模块描述浅析 四.配置文档 1.总配置 2.数据库配置 3.密码设置 4.配置建议 五.在IDEA中执行MySQ ...

  5. go-websocket服务端/客户端

    目录 websocket 服务端 客户端 websocket websocket.Upgrader升级为websocket协议 服务端 package main import ( "fmt& ...

  6. node技术是啥?

    node.js 一句话,就是把js代码放在服务器段运行的一种技术.

  7. Centos 7以上安装Docker (亲测有效)

    一.安装前的准备 我的环境是VMware15虚拟机安装的Centos7,Linux内核是3.10.0-1062.4.1.e17.x86_64 1. 用root账户登录查看操作系统内核版本及相关信息 [ ...

  8. 143. Reorder List - LeetCode

    Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前 ...

  9. Vben Admin 源码学习:状态管理-错误日志

    0x00 前言 本文将对 Vue-Vben-Admin 的状态管理实现源码进行分析解读,耐心读完,相信您一定会有所收获! 0x01 errorLog.ts 错误日志 文件 src\store\modu ...

  10. Aged-cat 的 WebServer 配置详细流程

    前言 最近看到一个不错的webserver项目,但是配置过程给的不详细,这里给出详细配置过程 项目地址:https://github.com/Aged-cat/WebServer (感谢老猫大神的项目 ...