.NET日志系统架构与最佳实践全解析
1. .NET日志系统核心架构解析日志系统是.NET应用开发中不可或缺的组件它由三个核心部分组成Logger、Provider和Filter。Logger负责生成日志消息Provider决定日志的输出目的地Filter则控制哪些日志应该被记录。典型的日志记录流程如下应用程序调用ILogger接口记录日志日志系统根据配置确定日志级别是否满足记录条件满足条件的日志被传递给所有注册的Provider每个Provider按照自己的方式处理并输出日志// 基础日志记录示例 var loggerFactory LoggerFactory.Create(builder { builder.AddConsole(); builder.AddDebug(); }); var logger loggerFactory.CreateLoggerProgram(); logger.LogInformation(Application started at {StartTime}, DateTime.Now);2. 日志级别的最佳实践.NET定义了6种日志级别按严重程度从低到高依次为日志级别适用场景生产环境建议Trace最详细的调试信息禁用Debug开发调试信息按需启用Information业务流程跟踪保留关键路径Warning非预期但不影响流程的事件全部保留Error当前操作失败全部保留Critical系统级故障全部保留配置建议// appsettings.json典型配置 { Logging: { LogLevel: { Default: Information, Microsoft: Warning, System: Warning }, Console: { LogLevel: { Default: Debug } } } }关键提示生产环境应将Microsoft开头的命名空间日志级别设为Warning避免框架日志淹没业务日志3. 结构化日志高级技巧结构化日志相比传统文本日志具有显著优势使用命名占位符而非字符串拼接// 推荐做法 logger.LogInformation(Order {OrderId} created for {UserId}, orderId, userId); // 避免做法 logger.LogInformation($Order {orderId} created for {userId});利用日志作用域关联相关日志using (logger.BeginScope(new Dictionarystring, object { [TransactionId] Guid.NewGuid(), [UserId] currentUserId })) { logger.LogInformation(Processing payment); // 相关日志会自动包含TransactionId和UserId }事件ID分类管理public static class AppLogEvents { public static readonly EventId Startup new(1000, ApplicationStartup); public static readonly EventId Shutdown new(1001, ApplicationShutdown); // 业务事件 public static readonly EventId OrderCreated new(2000, OrderCreated); } // 使用示例 logger.LogInformation(AppLogEvents.OrderCreated, New order created);4. 性能优化策略日志记录不当可能成为性能瓶颈以下是关键优化点避免昂贵的参数计算// 不推荐 - 即使不记录也会执行ToString() logger.LogDebug($Processed {CalculateMetrics()}); // 推荐 - 使用延迟计算 logger.LogDebug(Processed {Metrics}, CalculateMetrics());使用编译时日志生成.NET 6[LoggerMessage(EventId 0, Level LogLevel.Information, Message User {UserId} logged in from {IPAddress})] public static partial void LogUserLogin(ILogger logger, string userId, string ipAddress);异步日志处理模式// 配置支持异步的Provider builder.Logging.AddAsyncConsole(options { options.MaxQueueLength 1000; options.FlushInterval TimeSpan.FromSeconds(1); });5. 常见问题排查指南5.1 日志不输出问题检查步骤确认日志级别设置正确检查是否添加了对应的Provider验证配置文件是否被正确加载检查日志过滤规则// 调试日志配置 var logLevel loggerFactory.Services .GetRequiredServiceIOptionsLoggerFilterOptions() .Value.MinLevel; logger.LogDebug(Current log level: {LogLevel}, logLevel);5.2 日志格式混乱解决方案统一配置日志格式化器builder.Logging.AddSimpleConsole(options { options.TimestampFormat yyyy-MM-dd HH:mm:ss ; options.IncludeScopes true; options.SingleLine true; });使用JSON结构化输出builder.Logging.AddJsonConsole(options { options.JsonWriterOptions new JsonWriterOptions { Indented true }; });5.3 日志文件过大处理方案配置日志滚动策略builder.Logging.AddFile(options { options.FileName app-; options.Extension .log; options.Periodicity PeriodicityOptions.Daily; options.RetainedFileCountLimit 7; });实现日志压缩归档services.AddHostedServiceLogArchiverBackgroundService();6. 高级应用场景6.1 分布式追踪集成builder.Logging.AddOpenTelemetry(options { options.IncludeScopes true; options.AddOtlpExporter(otlpOptions { otlpOptions.Endpoint new Uri(http://collector:4317); }); });6.2 动态日志级别调整实现无需重启的热更新var reloadToken config.GetReloadToken(); reloadToken.RegisterChangeCallback(_ { logger.LogInformation(Logging configuration reloaded); }, null);6.3 自定义日志Provider实现自定义Provider的步骤继承ILoggerProvider实现ISupportExternalScope如需作用域支持创建对应的ILogger实现public class CustomLoggerProvider : ILoggerProvider { public ILogger CreateLogger(string categoryName) new CustomLogger(); public void Dispose() { } private class CustomLogger : ILogger { public IDisposable BeginScopeTState(TState state) null; public bool IsEnabled(LogLevel logLevel) true; public void LogTState(LogLevel logLevel, EventId eventId, TState state, Exception exception, FuncTState, Exception, string formatter) { // 自定义日志处理逻辑 } } }7. 生产环境部署建议日志分离策略业务日志与应用日志分离不同级别日志分开存储关键操作单独记录审计日志安全注意事项避免记录敏感信息密码、token等实施日志访问控制考虑日志脱敏处理监控方案builder.Logging.AddApplicationInsights( configureTelemetryConfiguration: config config.ConnectionString YOUR_INSTRUMENTATION_KEY, configureApplicationInsightsLoggerOptions: options {} );性能指标监控var meter new Meter(Microsoft.Extensions.Logging, 1.0.0); var loggingCounter meter.CreateCounterint(logs-written);

相关新闻

苹果涨价背后的消费电子行业变革

苹果涨价背后的消费电子行业变革

1. 涨价现象背后的行业信号上周三凌晨,苹果官网悄然更新了Mac产品线的价格标签。MacBook Air基础款从7999元调整为8499元,MacBook Pro 14英寸入门型号从14999元涨至15999元,iMac 24英寸版本也有500-800元不等的涨幅。这波平均6-8%的调价幅度&…

2026/7/28 17:40:44 阅读更多 →
2026-07-22:最大化特殊下标数目的最少增加次数。用go语言,给定一个长度为 n 的整数数组,如果某个下标 i(不是第一个也不是最后一个)满足它对应的元素比左右邻居都大,那么这个位置就算作“特殊

2026-07-22:最大化特殊下标数目的最少增加次数。用go语言,给定一个长度为 n 的整数数组,如果某个下标 i(不是第一个也不是最后一个)满足它对应的元素比左右邻居都大,那么这个位置就算作“特殊

2026-07-22:最大化特殊下标数目的最少增加次数。用go语言,给定一个长度为 n 的整数数组,如果某个下标 i(不是第一个也不是最后一个)满足它对应的元素比左右邻居都大,那么这个位置就算作“特殊位置”。 你可…

2026/7/27 7:21:09 阅读更多 →
导购比价小程序场景|京东联盟商品详情对接方案|多规格图文拉取技术实操

导购比价小程序场景|京东联盟商品详情对接方案|多规格图文拉取技术实操

一、业务背景:导购比价小程序核心落地痛点随着私域流量、内容种草、电商导购模式快速普及,轻量化导购比价小程序成为个人创业者、自媒体团队、电商服务商的主流变现载体。这类小程序核心能力是聚合京东海量商品、展示完整商品信息、实现多商品比价、精准…

2026/7/27 6:46:13 阅读更多 →

最新新闻

Adobe-GenP 3.0:三步解锁Adobe全家桶的专业级解决方案

Adobe-GenP 3.0:三步解锁Adobe全家桶的专业级解决方案

Adobe-GenP 3.0:三步解锁Adobe全家桶的专业级解决方案 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 还在为Adobe Creative Cloud高昂的订阅费用而烦恼…

2026/7/28 17:40:58 阅读更多 →
移动端案例 — 横向滚动、楼层效果、导航吸顶效果、tab切换

移动端案例 — 横向滚动、楼层效果、导航吸顶效果、tab切换

您的支持是我继续创作及维护的动力&#xff0c;感谢打赏&#xff0c;祝您工作顺利&#xff0c;生活美满&#xff01;&#xff01;&#xff01; 以下效果基于better-scroll插件实现 效果演示&#xff1a;横向滚动 源代码&#xff1a; <div class"wrapper">…

2026/7/28 17:40:58 阅读更多 →
三分钟搞定上百个Excel文件搜索:QueryExcel批量查询工具终极指南

三分钟搞定上百个Excel文件搜索:QueryExcel批量查询工具终极指南

三分钟搞定上百个Excel文件搜索&#xff1a;QueryExcel批量查询工具终极指南 【免费下载链接】QueryExcel 多Excel文件内容查询工具。 项目地址: https://gitcode.com/gh_mirrors/qu/QueryExcel 还在为海量Excel数据查找而头痛吗&#xff1f;QueryExcel多Excel文件内容查…

2026/7/28 17:40:58 阅读更多 →
C++文件流(ofstream/ifstream)详解:从基础读写到性能优化实战

C++文件流(ofstream/ifstream)详解:从基础读写到性能优化实战

1. 项目概述&#xff1a;为什么文件流是C开发的基石在C开发的日常里&#xff0c;无论你是处理配置文件、记录日志、序列化数据还是分析大型数据集&#xff0c;都绕不开一个核心操作&#xff1a;与硬盘上的文件打交道。很多新手&#xff0c;甚至一些有经验的开发者&#xff0c;在…

2026/7/28 17:40:57 阅读更多 →
空气净化器选购指南:从CADR/CCM原理到实战评测,以AirX A10SE359为例

空气净化器选购指南:从CADR/CCM原理到实战评测,以AirX A10SE359为例

最近在帮朋友挑选空气净化器时&#xff0c;发现面对市面上琳琅满目的产品&#xff0c;尤其是“除甲醛”、“杀菌”、“过敏原”这些宣传点&#xff0c;很难判断哪款是真实力&#xff0c;哪款只是营销话术。特别是对于新装修家庭、有宠物或易过敏人群&#xff0c;选错产品不仅白…

2026/7/28 17:40:57 阅读更多 →
利用PostExpKit插件实现Windows UAC绕过提权实战指南

利用PostExpKit插件实现Windows UAC绕过提权实战指南

1. 项目概述与核心思路拆解 “绕过UAC提权”是Windows安全领域一个经久不衰的话题&#xff0c;也是渗透测试和红队评估中获取更高权限的关键一步。UAC&#xff0c;即用户账户控制&#xff0c;是微软在Vista及之后系统中引入的一道重要安全防线&#xff0c;旨在阻止未经授权的应…

2026/7/28 17:39:57 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿&#xff01;3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑&#xff1a;把几百页的财报、法规、技术手册扔给向量库&#xff0c;问一个具体问题&#xff0c;搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了&#xff0c;要么藏在几十条结果的最下面。语义相似≠真正相关&#xff0c;这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营&#xff0c;从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候&#xff0c;每天刷半小时抖音&#xff0c;手动把爆款视频的口播敲进备忘录&#xff0c;一条2分钟的视频得花十来分钟&#xff0c;碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档&#xff0c;可以直接使用&#xff01;系统支持图片、视频、摄像头等多种方式检测裂缝&#xff0c;功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像&#xff01; pubg绝地求生目标检测数据集 1分类&#xff1a;e_body&#xff0c;14905个标签&#xff0c;txt格式 共计14244张图&#xff0c;99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别&#xff1a; allies enemy tag图片总量&#xff1a;7247张训练集&#xff1a;5139张验证集&#xff1a;1425张测试集&#xff1a;683张标注状态&#xff1a;全部已标注&#xff0c;即拿即用数据格式&#xff1a;支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻