如何在.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,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...
随机推荐
- [PKM] 个人知识管理
1 个人知识管理的需求 1.1 背景 随着信息大爆炸,碎片化的知识越来越多,原来中小学阶段在学校中习得的.传统的.基于纸质笔记的知识管理方式已不能满足当前的诉求. 传统的基于纸质笔记的知识管理方式 工 ...
- [数据库/ORALCE]导入/导出数据
ORACLE数据导入/导出 工具介绍:EXP/IMP | EXPDP/IMPDP EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具程序 ...
- 600 条最强 Linux 命令总结
600 条最强 Linux 命令总结 每博一文案 你有千万条微博想写,可有些根本不重要,后来你才懂那是你怕别人看穿你所以才把真话埋在日常里.你有千万句话想说,可点开那 个对话框,你根本打不出一个字.你 ...
- 使用 LoRA 和 Hugging Face 高效训练大语言模型
在本文中,我们将展示如何使用 大语言模型低秩适配 (Low-Rank Adaptation of Large Language Models,LoRA) 技术在单 GPU 上微调 110 亿参数的 F ...
- MySQL(十二)索引使用的情况分析
索引使用的情况分析 数据准备 创建表student_info.course CREATE TABLE `student_info` ( `id` int NOT NULL AUTO_INCREMENT ...
- 安装MinGW,使用vscode进行C++编译
1.下载 https://osdn.net/projects/mingw/downloads/68260/mingw-get-setup.exe/ 2.安装 直接默认所有选项安装即可,可以更换安装位置 ...
- 基于Python的爬虫案例
案例1:使用爬虫爬取京东华为手机用户评论 本案例借鉴哔哩哔哩博客主视频教程,感谢其教程为我开启了爬虫之旅:https://www.bilibili.com/video/BV1Yt4y1Y7nt?t=3 ...
- 聊聊Redis sentinel 机制
Redis 的哨兵机制自动完成了以下三大功能,从而实现了主从库的自动切换,可以降低 Redis 集群的运维开销: 监控主库运行状态,并判断主库是否客观下线: 在主库客观下线后,选取新主库: 选出新主库 ...
- TiDB在X86和ARM混合平台下的离线部署和升级
[是否原创]是 [首发渠道]TiDB 社区 背景 在之前我们团队发布了TiDB基于X86和ARM混合部署架构的文章:TiDB 5.0 异步事务特性体验--基于X86和ARM混合部署架构,最近有朋友问到 ...
- 如果你项目使用了MyBatis-Plus你一定要用它
还是先举个例子,魂斗罗小游戏应该很多90后都玩过,那个时代没有Iphone,没有各种电子产品(小学初中时代),这种小游戏应该就是很多90后的青春,反正那个时候只要放假就白天黑夜得玩.它就是那种2个好基 ...