在 ASP.NET C# Web API 中实现 Serilog 以增强请求和响应的日志记录

介绍
日志记录是任何 Web 应用程序的关键方面。它有助于调试、性能监控和了解用户交互。在 ASP.NET C# 中,集成 Serilog 作为记录请求和响应(包括传入和传出的数据)的中间件可以显著提高 Web API 的可观察性和故障排除能力。
在过去的几周里,我一直在编写一些使用 Azure 表存储而不是 SQL 或 Postgres 数据库的不同 Web API,因为表存储非常便宜,而数据库很昂贵,而且我想尝试使用表存储来看看它在实际应用程序中有多么有用。
在这篇博文中,我将介绍使用 Serilog 在 ASP.NET C# Web API 中创建中间件类以进行全面日志记录的步骤。
设置 Serilog
首先,您需要将 Serilog 集成到您的 ASP.NET C# 项目中。Serilog 是一个功能强大且易于使用的日志库。
安装 Serilog 包:通过 NuGet 包管理器,安装Serilog、、Serilog.AspNetCore和Serilog.Sinks.File(或您选择的任何其他接收器)。
配置 Serilog:在您的Program.cs或 中Startup.cs,将 Serilog 配置为日志提供程序:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console()
.WriteTo.File("logs/myapp.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
创建中间件
ASP.NET Core 中的中间件是组装到应用程序管道中以处理请求和响应的软件。
创建一个新的中间件类SerilogMiddleware.cs:在您的项目中创建一个新类。
实现中间件逻辑:此类将拦截所有 HTTP 请求和响应,使我们能够记录必要的信息。
public class SerilogMiddleware
{
private readonly RequestDelegate _next;
public SerilogMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
// Log the Request
Log.Information($"Request {context.Request?.Method}: {context.Request?.Path.Value}");
// Read and log the request body data
string requestBodyPayload = await ReadRequestBody(context);
Log.Information($"Request Payload: {requestBodyPayload}");
// Copy a pointer to the original response body stream
var originalBodyStream = context.Response.Body;
using (var responseBody = new MemoryStream())
{
// Point the response body to a memory stream
context.Response.Body = responseBody;
await _next(context);
// Read and log the response body data
context.Response.Body.Seek(0, SeekOrigin.Begin);
string responseBodyPayload = await new StreamReader(context.Response.Body).ReadToEndAsync();
context.Response.Body.Seek(0, SeekOrigin.Begin);
Log.Information($"Response {context.Response?.StatusCode}: {responseBodyPayload}");
// Copy the contents of the new memory stream (which contains the response) to the original stream, which is then returned to the client.
await responseBody.CopyToAsync(originalBodyStream);
}
}
private async Task<string> ReadRequestBody(HttpContext context)
{
context.Request.EnableBuffering();
var buffer = new byte[Convert.ToInt32(context.Request.ContentLength)];
await context.Request.Body.ReadAsync(buffer, 0, buffer.Length);
string bodyAsText = Encoding.UTF8.GetString(buffer);
context.Request.Body.Seek(0, SeekOrigin.Begin);
return bodyAsText;
}
}
注册中间件
在该Startup.cs文件中,在方法中注册中间件Configure。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ... other configurations ...
// Register the Serilog middleware
app.UseMiddleware<SerilogMiddleware>();
// ... other configurations ...
}
结论
您已通过在 ASP.NET C# Web API 中实现 Serilog 中间件建立了强大的日志记录机制。这将记录所有请求和响应及其有效负载,让您详细了解 API 的运行情况。此设置对于诊断问题、了解用户行为和确保应用程序平稳运行非常有用。
请记住,虽然记录必不可少,但谨慎记录内容也至关重要,尤其是在处理敏感数据时。始终遵守有关数据处理和隐私的最佳实践和法律要求。
您可以从这里下载 Serilog:https://serilog.net

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
相关文章:
在 ASP.NET C# Web API 中实现 Serilog 以增强请求和响应的日志记录
介绍 日志记录是任何 Web 应用程序的关键方面。它有助于调试、性能监控和了解用户交互。在 ASP.NET C# 中,集成 Serilog 作为记录请求和响应(包括传入和传出的数据)的中间件可以显著提高 Web API 的可观察性和故障排除能力。 在过去的几周里&…...
2024年顶级小型语言模型前15名
本文,我们将深入了解2024年备受瞩目的十五款小型语言模型(SLMs),它们分别是Llama 3.1 8B、Gemma2、Qwen 2、Mistral Nemo、Phi-3.5等。这些SLMs以其精巧的体积和高效率著称,它们不需要依赖庞大的服务器资源,…...
精通 Python 网络安全(一)
前言 最近,Python 开始受到越来越多的关注,最新的 Python 更新添加了许多可用于执行关键任务的包。我们的主要目标是帮助您利用 Python 包来检测和利用漏洞,并解决网络挑战。 本书将首先带您了解与网络和安全相关的 Python 脚本和库。然后&…...
【python自动化二】pytest集成allure生成测试报告
pytest本身不会直接生成测试报告,而allure是一种生成测试报告的公共插件,可与多种测试框架配合生成测试报告,本文介绍下如何集成allure生成测试报告。 1.allure安装 1.安装allure-pytest 先安装allure的pytest插件,用于在pytes…...
网络版本的通讯录青春版(protobuf)
环境搭建 Protobuf 还常⽤于通讯协议、服务端数据交换场景。 因为我们主要目的只是为了学习protobuf,因此对于客户端,原本应该具备: 新增⼀个联系⼈ ◦ 删除⼀个联系⼈ ◦ 查询通讯录列表 ◦ 查询⼀个联系⼈的详细信息 这样四个功能。 …...
开源模型应用落地-安全合规篇-用户输入价值观判断(三)
一、前言 在深度合规功能中,对用户输入内容的价值观判断具有重要意义。这一功能不仅仅是对信息合法性和合规性的简单审核,更是对信息背后隐含的伦理道德和社会责任的深刻洞察。通过对价值观的判断,系统能够识别可能引发不当影响或冲突的内容,从而为用户提供更安全、更和谐的…...
神经网络入门实战:(十四)pytorch 官网内置的 CIFAR10 数据集,及其网络模型
(一) pytorch 官网内置的网络模型 图像处理: Models and pre-trained weights — Torchvision 0.20 documentation (二) CIFAR10数据集的分类网络模型(仅前向传播): 下方的网络模型图片有误,已做修改,具…...
【Rust在WASM中实现pdf文件的生成】
Rust在WASM中实现pdf文件的生成 前言概念和依赖问题描述分步实现pdf转Blob生成URL两种方式利用localstorage传递参数处理图片Vec<u8>到pdf格式的Vec<u8>使用rust创建iframe显示pdf的Blob最后 前言 实现了一个通用的前端jpg转pdf的wasm,因为动态响应框架无法直接打…...
在MySQL中执行sum case when报错:SUM does not exist
1. 报错 在pgsql中能正常运行的一段SQL在MySQL中运行的时候报错了: SELECT DATE( hr.handle_time ) AS statsDate,SUM ( CASE WHEN hma.app_type IN ( 2, 5 ) THEN ch_money ELSE 0 END ) AS aliPayAmt,SUM ( CASE WHEN hma.app_type IN ( 1, 4 ) THEN ch_money EL…...
【openssl】相关指令
熟悉下相关概念 x509:证书标准pem和der:两种(包括公私钥、证书签名请求、证书等内容的)的格式,前者是文本形式,linux常用,后者是二进制形式,windows常用,仅仅是格式&…...
实例分割详解
实例分割详解 引言 实例分割是计算机视觉领域的一项复杂任务,它要求模型能够识别图像中不同类别的对象,并对每个单独的对象进行像素级别的分类。与语义分割不同的是,实例分割不仅要区分不同的类别,还要识别同一类别中的不同个体…...
D87【python 接口自动化学习】- pytest基础用法
day87 pytest运行参数 -m -k 学习日期:20241203 学习目标:pytest基础用法 -- pytest运行参数-m -k 学习笔记: 常用运行参数 pytest运行参数-m -k pytest -m 执行特定的测试用例,markers最好使用英文 [pytest] testpaths./te…...
浅谈MySQL路由
华子目录 mysql-router介绍下载mysql-router安装mysql-router实验 mysql-router介绍 mysql-router是一个对应用程序透明的InnoDB Cluster连接路由服务,提供负载均衡、应用连接故障转移和客户端路由利用路由器的连接路由特性,用户可以编写应用程序来连接到…...
matlab中disp,fprintf,sprintf,display,dlmwrite输出函数之间的区别
下面是他们之间的区别: disp函数与fprintf函数的区别 输出格式的灵活性 disp函数:输出格式相对固定。它会自动将变量以一种比较直接的方式显示出来。对于数组,会按照行列形式展示;对于字符串,直接原样输出并换行。例如…...
30.100ASK_T113-PRO 用QT编写视频播放器(一)
1.再buildroot中添加视频解码库 X264, 执行 make menuconfig Target packages -->Libraries --> Multimedia --> X264 CLI 还需要添加 FFmpeg 2. 保存,重新编译 make all 3.将镜像下载开发板...
Linux-GPIO应用编程
本章介绍应用层如何控制 GPIO,譬如控制 GPIO 输出高电平、或输出低电平。 只要是用到GPIO的外设,都有可能用得到这些操作方法。 照理说,GPIO的操作应该是由驱动层去做的,使用寄存器操作或者GPIO子系统之类的框架。 但是࿰…...
opencvocr识别手机摄像头拍摄的指定区域文字,文字符合规则就语音报警
安装python,pycharm,自行安装。 Python下安装OpenCv 2.1 打开cmd,先安装opencv-python pip install opencv-python --user -i https://pypi.tuna.tsinghua.edu.cn/simple2.2 再安装opencv-contrib-python pip install opencv-contrib-python --user …...
微服务即时通讯系统(5)用户管理子服务,网关子服务
用户管理子服务(user文件) 用户管理子服务也是这个项目中的一个业务最多的子服务,接口多,但是主要涉及的数据表只有user表,Redis的键值对和ES的一个搜索引擎,主要功能是对用户的个人信息进行修改管理&#…...
postgreSQL安装后启动有The application server could not be contacted问题
不得不说pgsql是真的麻烦,找问题找了几个小时才解决.直接步入主题吧 首先问题如下 安装后,双击启动就出现上述问题 首先删除路径为 c:\Users\your_name\AppData\Roaming\pgAdmin 之内的所有文件和文件夹, 如果找不到AppData,就把这个点开 接着找到你安装pgsql的路径,我的是D…...
架构05-架构安全性
零、文章目录 架构05-架构安全性 1、软件架构安全的重要性 **系统安全:**不仅包括防御黑客攻击,还包括安全备份与恢复、安全审计、防治病毒等。**关注重点:**认证、授权、凭证、保密、传输安全、验证。 2、认证(Authenticatio…...
CANN/pypto循环结束判断API
pypto.is_loop_end 【免费下载链接】pypto PyPTO(发音: pai p-t-o):Parallel Tensor/Tile Operation编程范式。 项目地址: https://gitcode.com/cann/pypto 产品支持情况 产品是否支持Atlas A3 训练系列产品/Atlas A3 推理系列产品√…...
终极智慧树刷课插件指南:如何实现自动化高效学习
终极智慧树刷课插件指南:如何实现自动化高效学习 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台枯燥的手动操作而烦恼吗?智慧…...
【轴承故障诊断】一种用于轴承故障诊断的稀疏贝叶斯学习(SBL),两种群稀疏学习算法来提取故障脉冲,第一种仅利用故障脉冲的群稀疏性,第二种则利用故障脉冲的额外周期性行为(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
网络安全实战工具链:从信息收集到漏洞修复的工程化闭环
1. 这不是“黑客速成班”,而是安全工程师真实工作流的切片很多人看到“挖漏洞”三个字,第一反应是黑进某个网站、弹出个红色命令行、屏幕上飞速滚动着看不懂的字符——然后“啪”一声,系统瘫痪。现实里我干了八年渗透测试和红队支撑ÿ…...
Open MCT性能测试实战:JMeter多协议分层压测方法
1. 为什么Open MCT的性能不能只靠“感觉”来判断?Open MCT——NASA开源的航天器监控与控制系统可视化平台,这几年在工业物联网、能源调度、科研实验数据看板等场景里越来越常见。但凡接触过它的人,几乎都会在部署后遇到同一个问题:…...
第九届蓝桥杯国赛b组--备战国赛版h
第一题:0换零钞 - 蓝桥云课 模拟 #include <bits/stdc.h> using namespace std; int main() {int a,b,c0;for(a1;a<200;a)//一元钞票{for(b1;b<100;b)//两元钞票{for(c1;c<40;c)//五元钞票{if(ba*10&&(ab*2c*5)200){cout<<abc<&l…...
微信聊天记录永久保存指南:5分钟掌握WeChatMsg完整备份方案
微信聊天记录永久保存指南:5分钟掌握WeChatMsg完整备份方案 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/…...
单智能体 vs 多智能体系统:架构对比与选择
单智能体 vs 多智能体系统:架构对比与选择 1. 标题 (Title) 单智能体 vs 多智能体系统:架构对比与选择指南 从单体到群体:智能体系统架构的深度解析与选型策略 智能体系统设计:何时选择单智能体,何时拥抱多智能体? 单一智慧 vs 群体智能:智能体系统架构对比与实践指南 …...
vcs+verdi+vivado联合仿真
1.软件版本vivado和vcs的软件版本兼容Xilinx官方指导手册UG973本次使用的Vivado版本为2018.2图为Vivado2018.2支持的vcs版本,此时vcs有vcs和vcs-mx两种版本。VCS和VCS_MX的区别VCS_MX为mixed hdl 仿真器,支持vhdlverilogsv的混合仿真。vcs则是纯verilog的…...
SABIC塑料解决方案:宏裕塑胶全面代理原GE塑料高性能材料产品
宏裕塑胶依托源头直采优势整合沙伯基础创新SABIC等国际品牌资源,为制造业客户提供高性价比通用工程塑料原料及全流程技术支撑,助力企业降本增效。其代理产品涵盖PETG、PCTG、PBT、TPEE等全品类工程塑料,专为塑胶制品厂、汽车零部件厂等客户群…...
