如何在.net6webapi中记录每次接口请求的日志
为什么在软件设计中一定要有日志系统?
在软件设计中日志模块是必不可少的一部分,可以帮助开发人员更好的了解程序的运行情况,提高软件的可靠性,安全性和性能,日志通常能帮我们解决如下问题:
- 调试和故障排查:日志可以记录程序运行时的各种信息,包括错误,异常,警告等,方便开发人员在出现问题时进行调试和故障排查。
- 性能优化:日志可以记录程序的运行时间,资源占用等信息,帮助开发人员进行性能优化。
- 安全审计:日志可以记录用户的操作行为,方便进行安全审计和追踪。
- 统计分析:日志可以记录用户的访问情况,使用习惯等信息,方便进行统计分析和用户行为研究。
- 业务监控:日志可以记录业务数据的变化情况,方便进行业务监控和数据分析。
- 数据还原:日志记录每次请求的请求及响应数据,可以在数据丢失的情况下还原数据。
如何在.net6webapi中添加日志?
1.添加日志组件
.net6有自带的logging组件,还有很多优秀的开源log组件,如NLog,serilog,这里我们使用serilog组件来构建日志模块。
新建.net6,asp net web api项目之后,为其添加如下四个包

dotnet add package Serilog.AspNetCore//核心包
dotnet add package Serilog.Formatting.Compact
dotnet add Serilog.Sinks.File//提供记录到文件
dotnet add Serilog.Sinks.MSSqlServer//提供记录到sqlserver
2.新建SeriLogExtend扩展类型,配置日志格式并注入
public static class SeriLogExtend
{
public static void AddSerilLog(this ConfigureHostBuilder configureHostBuilder)
{
//输出模板
string outputTemplate = "{NewLine}【{Level:u3}】{Timestamp:yyyy-MM-dd HH:mm:ss.fff}" +
"{NewLine}#Msg#{Message:lj}" +
"{NewLine}#Pro #{Properties:j}" +
"{NewLine}#Exc#{Exception}" +
new string('-', 50); // 配置Serilog
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning) // 排除Microsoft的日志
.Enrich.FromLogContext() // 注册日志上下文
.WriteTo.Console(outputTemplate: outputTemplate) // 输出到控制台
.WriteTo.MSSqlServer("Server=.;Database=testdb;User ID=sa;Password=123;TrustServerCertificate=true", sinkOptions: GetSqlServerSinkOptions(), columnOptions: GetColumnOptions())
.WriteTo.Logger(configure => configure // 输出到文件
.MinimumLevel.Debug()
.WriteTo.File( //单个日志文件,总日志,所有日志存到这里面
$"logs\\log.txt",
rollingInterval: RollingInterval.Day,
outputTemplate: outputTemplate)
.WriteTo.File( //每天生成一个新的日志,按天来存日志
"logs\\{Date}-log.txt", //定输出到滚动日志文件中,每天会创建一个新的日志,按天来存日志
retainedFileCountLimit: 7,
outputTemplate: outputTemplate
))
.CreateLogger(); configureHostBuilder.UseSerilog(Log.Logger); // 注册serilog /// <summary>
/// 设置日志sqlserver配置
/// </summary>
/// <returns></returns>
MSSqlServerSinkOptions GetSqlServerSinkOptions()
{
var sqlsinkotpions = new MSSqlServerSinkOptions();
sqlsinkotpions.TableName = "sys_Serilog";//表名称
sqlsinkotpions.SchemaName = "dbo";//数据库模式
sqlsinkotpions.AutoCreateSqlTable = true;//是否自动创建表
return sqlsinkotpions;
} /// <summary>
/// 设置日志sqlserver 列配置
/// </summary>
/// <returns></returns>
ColumnOptions GetColumnOptions()
{
var customColumnOptions = new ColumnOptions(); customColumnOptions.Store.Remove(StandardColumn.MessageTemplate);//删除多余的这两列
customColumnOptions.Store.Remove(StandardColumn.Properties); var columlist = new List<SqlColumn>();
columlist.Add(new SqlColumn("RequestJson", SqlDbType.NVarChar, true, 2000));//添加一列,用于记录请求参数string
columlist.Add(new SqlColumn("ResponseJson", SqlDbType.NVarChar, true, 2000));//添加一列,用于记录响应数据
customColumnOptions.AdditionalColumns = columlist;
return customColumnOptions;
}
}
}
然后再program.cs中调用这个扩展方法
var builder = WebApplication.CreateBuilder(args); // Add services to the container.
builder.Services.AddControllers(options =>
{
options.Filters.Add(typeof(RequestLoggingFilter));
});
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Host.AddSerilLog(); var app = builder.Build(); // Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
这里我设计的日志信息只包括了
- Message:日志信息
- Level:等级
- TimeStamp:记录日志时间
- Exception:异常信息
- RequestJson:请求参数json
- ResponseJson:响应结果json
其中前面四种为日志默认,后两种为我主动添加,在实际的设计中还有可能有不同的信息,如:
- IP:请求日志
- Action:请求方法
- Token:请求token
- User:请求的用户
日志的设计应该根据实际的情况而来,其应做到足够详尽,能帮助开发者定位,解决问题,而又不能过于重复臃肿,白白占用系统空间,我这边的示例仅供大家参考
3.添加RequestLoggingFilter过滤器,用以记录每次请求的日志
public class RequestLoggingFilter : IActionFilter
{
private readonly Serilog.ILogger _logger;//注入serilog
private Stopwatch _stopwatch;//统计程序耗时 public RequestLoggingFilter(Serilog.ILogger logger)
{
_logger = logger;
_stopwatch = Stopwatch.StartNew();
} public void OnActionExecuted(ActionExecutedContext context)
{
_stopwatch.Stop();
var request = context.HttpContext.Request;
var response = context.HttpContext.Response;
_logger
.ForContext("RequestJson",request.QueryString)//请求字符串
.ForContext("ResponseJson", JsonConvert.SerializeObject(context.Result))//响应数据json
.Information("Request {Method} {Path} responded {StatusCode} in {Elapsed:0.0000} ms",//message
request.Method,
request.Path,
response.StatusCode,
_stopwatch.Elapsed.TotalMilliseconds);
} public void OnActionExecuting(ActionExecutingContext context)
{
}
}
在program.cs中将该过滤器添加进所有控制器之中
builder.Services.AddControllers(options =>
{
options.Filters.Add(typeof(RequestLoggingFilter));
});
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Host.AddSerilLog(); var app = builder.Build(); // Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
测试效果
在控制器添加一个测试方法并将其调用一次
[HttpGet]
public dynamic Get123(string model)
{
return new { name = "123", id = 2 };
}

控制台输出

数据库记录

项目根目录下logs文件夹中日志文件记录

如何在.net6webapi中记录每次接口请求的日志的更多相关文章
- 如何在MySql中记录SQL日志记录
My SQL可以用下面方法跟踪sql 语句,以下方法以Windows平台为例,linux雷同: 1 配置my.ini文件(在安装目录,linux下文件名为my.cnf 查找到[mysql ...
- 如何在MySql中记录SQL日志
SQL server有一个sql profiler可以实时跟踪服务器执行的SQL语句,这在很多时候调试错误非常有用.例如:别人写的复杂代码.生产系统.无调试环境.无原代码... ... 查了一下资 ...
- spring aop实现拦截接口请求打印日志
在spring配置 1编写自己的注解类 2.编写注解解析类 3.配置spring aop代理 (下面我使用注解 如使用配置 配置切点即可,有两种代理默认jdk代理 设置true 为cglib代理) / ...
- vue打包后,接口请求404的完美解决方案
在开发环境中,和后台对接为了解决跨域问题,使用了代理,也就是vue的proxyTable,但是打包放到生产环境中去时,接口请求不到,404,原因是开发环境的代理并不能用到生产环境,但是直接在请求接口是 ...
- 记录python接口自动化测试--从excel中读取params参数传入requests请求不生效问题的解决过程(第七目)
在第六目把主函数写好了,先来运行一下主函数 从截图中可以看到,请求参数打印出来了,和excel中填写的一致 但是每个接口的返回值却都是400,提示参数没有传进去,开始不知道是什么原因(因为excel中 ...
- 我是如何在SQLServer中处理每天四亿三千万记录的
首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...
- 【转】我是如何在SQLServer中处理每天四亿三千万记录的
原文转自:http://blog.jobbole.com/80395/ 首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文 ...
- 如何在SQLServer中处理每天四亿三千万记录
首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...
- (转)我是如何在SQLServer中处理每天四亿三千万记录的
首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...
- (转)我是如何在SQLServer中处理每天四亿三千万记录的
首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...
随机推荐
- Mysql简明语法
show databases ; use mybatis; show tables ; select * from user; select * from user where id=1; updat ...
- python:生成半年内的巡检日报execl
问题描述:使用脚本来生成半年内的数据,数据内容大概为每天的数据库巡检日报,临时抱佛脚.数据不可能是真实的,都是随机生成的,想要使用真实的数据后面直连操作系统或者数据库.后期可以慢慢实现自动化生成每天的 ...
- 如何在 vue3 中使用 jsx/tsx?
我们都知道,通常情况下我们使用 vue 大多都是用的 SFC(Signle File Component)单文件组件模式,即一个组件就是一个文件,但其实 Vue 也是支持使用 JSX 来编写组件的.这 ...
- 项目中统计SQL执行缓慢的方案-数据预处理
使用场景: 由于表数据量巨大,导致一些统计相关的sql执行非常慢,使用户有非常不好的体验,并且sql和数据库已经没有优化空间了.(并且该统计信息数据实时性要求不高的前提下) 解决方案: 整体思路:创建 ...
- rockyLinux 初体验(教程)PostgreSQL15
目录 数据库软件 PostgreSQL 安装 数据库软件 PostgreSQL 配置 数据库软件 PostgreSQL 交互 通用数据库管理软件 DBeaver 彼时,PostgreSQL 已经更新到 ...
- VUEX(状态管理)之憨憨篇
1.导入vuex包 import vuex from 'vuex' 2.注册vuex到vue中 vue.use(vuex) 3.new vuex.store() 得到一个数据存储对象 var stor ...
- C# 获取系统已安装的.NET版本
获取系统已安装的.NET版本,来确定当前应用可运行的环境. 微软已经有相应的完整文档,请参考:确定已安装的 .NET Framework 版本 - .NET Framework | Microsoft ...
- 极速进化,光速转录,C++版本人工智能实时语音转文字(字幕/语音识别)Whisper.cpp实践
业界良心OpenAI开源的Whisper模型是开源语音转文字领域的执牛耳者,白璧微瑕之处在于无法通过苹果M芯片优化转录效率,Whisper.cpp 则是 Whisper 模型的 C/C++ 移植版本, ...
- PaddlePaddle 自动求导
自动求导 在 PaddlePaddle 中使用自动求导来计算导数. 要求:$ f(x)=\sin{x} $,绘制 \(f(x)\) 和 \(\dfrac{\mathrm{d}f(x)}{\mathrm ...
- 2021-04-16:摆放着n堆石子。现要将石子有次序地合并成一堆,规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。求出将n堆石子合并成一堆的最小得分(或最大得分)合
2021-04-16:摆放着n堆石子.现要将石子有次序地合并成一堆,规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分.求出将n堆石子合并成一堆的最小得分(或最大得分)合 ...