C# | Serilog 新手入门
C# Serilog 新手入门文章目录C# Serilog 新手入门1. 什么是第三方日志库与 Serilog1.1 概念讲解什么是日志为什么不能只写 Console.WriteLine1.2 C# 生态中的优秀日志库对比1.3 C# 日志技术的演进历程2. Serilog 结构化日志与传统日志的对比2.1 结构化日志Structured Logging的核心特点传统日志代码与产出Serilog 结构化日志代码与产出2.2 Serilog 在代码与日志查询上的优势2.3 帮助小白快速理解的心智模型3. 引入 Serilog 的意义与架构定位3.1 实际应用场景与效率提升3.2 软件架构中的定位4. Serilog 动手实战4.1 第一行代码5 分钟跑通 Hello World第一步安装 NuGet 包第二步编写极简控制台程序4.2 语法与配置详解4.2.1 结构化日志语法格式与核心组件4.2.2 两种配置方式Fluent API 代码配置 vs appsettings.json 声明式配置方式一Fluent API代码链式调用适合小型项目或控制台应用方式二appsettings.json推荐适合 ASP.NET Core 项目灵活可配置5. 总结针对刚接触 C# 开发、从未独立使用过第三方日志库的新手很多关于 Serilog 的官方文档过于偏向 API 说明容易让人“知其然不知其所以然”。本教程参考了模块化的递进架构用通俗直白的语言带你彻底搞懂Serilog到底强在哪以及如何在真实系统中合理定位它。1. 什么是第三方日志库与 Serilog1.1 概念讲解什么是日志为什么不能只写Console.WriteLine在刚学 C# 时很多人习惯用Console.WriteLine(用户登录成功)来查看程序运行状态。但在真实的企业级项目如 Web API、后台服务中这种做法存在巨大隐患数据随用随丢程序重启或控制台窗口一关输出的信息全部消失。没有级别区分无法区分普通提示Information、警告Warning还是系统崩溃Fatal。阻塞性能直接向控制台频繁写数据是同步且昂贵的 I/O 操作会导致高并发下程序卡死。缺乏上下文只写一句“报错了”你不知道是谁在什么时间、哪条线程、哪个请求上报的错。第三方日志库就是为此而生的专业管家。它能够异步、高性能地将程序运行过程中的重要状态记录下来并自动附带时间戳、线程号、日志级别最终将日志输出到文件、数据库或远程日志中心进行长期保存。1.2 C# 生态中的优秀日志库对比C# 生态发展至今出现了几款经典的第三方日志库日志库历史与特点适用场景Log4net移植自 Java 的 Log4j历史最悠久古老且稳定。老旧项目的维护。由于配置繁琐大量 XML、缺少现代化特性新项目不推荐。NLog性能优异配置灵活在 C# 生态中流行多年。各种中大型传统项目功能非常强大。Serilog现代化日志库首选天然为“结构化日志”而生社区最活跃。全新项目的首选特别是结合 Seq、ELK 等现代日志分析平台的项目。1.3 C# 日志技术的演进历程C# 日志技术经历了四个主要阶段原始时代直接使用Console.WriteLine()或System.Diagnostics.Trace功能极其原始。文本日志时代Log4net / NLog 早期开始将日志格式化写入文本文件如.log文件但日志内容全是一串串拼接的字符串。接口抽象时代Microsoft.Extensions.Logging微软推出了官方日志抽象接口ILogger框架只定义标准具体实现交由第三方库如 Serilog完成。结构化日志时代Serilog 领衔不再把日志当作“一句话”而是当作“带属性的 JSON 数据对象”掀起了现代化运维与排查的变革。2. Serilog 结构化日志与传统日志的对比2.1 结构化日志Structured Logging的核心特点传统日志输出的是非结构化纯文本而 Serilog 输出的是结构化键值数据。传统日志代码与产出// 传统拼接字符串logger.Info(用户 userId 在 DateTime.Now 购买了商品 productId);// 产出文本: 用户 10086 在 2026-08-09 10:00:00 购买了商品 9988当你在数 GB 的日志文件中想要检索“用户 10086 买了哪些商品”时只能用复杂的正则表达式或全文逐字匹配非常缓慢且容易误判。Serilog 结构化日志代码与产出// Serilog 消息模板注意变量名前的名称logger.Information(用户 {UserId} 购买了商品 {ProductId},userId,productId);Serilog 在后台不仅会生成人眼可读的文本还会同时保留数据的原始结构{Timestamp:2026-08-09T10:00:00Z,Level:Information,MessageTemplate:用户 {UserId} 购买了商品 {ProductId},Properties:{UserId:10086,ProductId:9988}}2.2 Serilog 在代码与日志查询上的优势像查 SQL 数据库一样查日志因为属性被单独提取保存了在 Seq 或 Elasticsearch 等日志系统中你可以直接输入Properties.UserId 10086或Properties.ProductId 1000实施精确过滤。复杂对象的原生拆解如果你传入一个 C# 对象在变量名前加上符号如{User}Serilog 会自动将其序列化为 JSON 展开存储无需手动JsonConvert.SerializeObject。2.3 帮助小白快速理解的心智模型❌传统日志的心智模型把日志当成记事本疯狂向里面追加一行行打印出来的文本。✅Serilog 的心智模型把打日志当成向一个无模式NoSQL数据库插入事件记录。你每一次记录日志都是在发起一次数据结构收集。3. 引入 Serilog 的意义与架构定位3.1 实际应用场景与效率提升生产环境快速排错系统报错时无需猜测参数结构化日志直接呈现当时请求入参的完整 JSON 数据。性能瓶颈追踪通过在日志中附带ElapsedMilliseconds可以秒级筛选出“执行时间大于 2000ms”的所有数据库查询日志。安全审计与业务分析记录关键业务事件如支付、修改密码方便日后查账或统计用户行为轨迹。3.2 软件架构中的定位在遵循领域驱动设计DDD或分层架构的系统里日志属于典型的横切关注点Cross-Cutting Concerns。配置与初始化位于系统的最外层基础设施层/启动入口。业务层使用业务层应用层、领域层不直接依赖 Serilog而是通过依赖注入使用微软官方抽象的ILoggerT接口记录日志。这样可以实现业务逻辑与具体日志实现框架的解耦。下面的架构图展示了 Serilog 在 DDD 系统中的位置与数据流向外部日志接收终端Cross-Cutting ConcernsInfrastructure LayerDomain LayerApplication LayerPresentation Layer调用调用数据持久化提供实现并注册依赖注入依赖注入依赖注入异步刷盘/推送网络发送 JSONOrdersControllerOrderAppServiceOrderDomainServiceDatabase ContextSerilog 配置与全局初始化Microsoft.Extensions.Logging.ILogger本地磁盘文件Seq 日志服务器 / ELKInfraLayer4. Serilog 动手实战4.1 第一行代码5 分钟跑通 Hello World第一步安装 NuGet 包打开 Visual Studio 的 NuGet 包管理器安装以下三个包Serilog核心库Serilog.Sinks.Console输出到控制台插件Serilog.Sinks.File输出到文件插件第二步编写极简控制台程序usingSerilog;classProgram{staticvoidMain(){// 1. 初始化 Serilog 配置Log.LoggernewLoggerConfiguration().MinimumLevel.Debug()// 设置最低日志记录级别.WriteTo.Console()// 输出到控制台.WriteTo.File(logs/myapp.txt,rollingInterval:RollingInterval.Day)// 按天生成日志文件.CreateLogger();// 2. 打出第一行日志Log.Information(Hello, Serilog! 欢迎来到结构化日志的世界。);// 3. 带有变量的结构化日志stringuserName张三;intage18;Log.Information(创建用户姓名{UserName}, 年龄{Age},userName,age);// 4. 确保程序退出前把内存中的日志刷入磁盘Log.CloseAndFlush();}}4.2 语法与配置详解4.2.1 结构化日志语法格式与核心组件Serilog 由三个核心概念组成Sinks输出接收端日志去哪里控制台、文件、数据库、Seq、Elasticsearch。Enrichers上下文增强器自动补全环境信息如当前线程 ID、机器名、环境名。Message Template消息模板定义变量提取规则。关键语法技巧与$占位符varusernew{Id1001,Name李四,RoleAdmin};// 1. 默认处理Serilog 会调用 user.ToString()通常输出类名Log.Information(用户信息{User},user);// 2. 加上 符号Destructuring 解构把对象展开为 JSON 存储Log.Information(用户信息{User},user);// 3. 加上 $ 符号强制转换为字符串即使是复杂对象Log.Information(用户信息{$User},user);4.2.2 两种配置方式Fluent API 代码配置 vsappsettings.json声明式配置方式一Fluent API代码链式调用适合小型项目或控制台应用Log.LoggernewLoggerConfiguration().MinimumLevel.Information().Enrich.WithThreadId()// 需要安装 Serilog.Enrichers.Thread 包.WriteTo.Console(outputTemplate:[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} (Thread:{ThreadId}){NewLine}{Exception}).CreateLogger();方式二appsettings.json推荐适合 ASP.NET Core 项目灵活可配置需要安装包Serilog.Settings.Configuration和Serilog.AspNetCore。1. 修改appsettings.json文件{Serilog:{MinimumLevel:{Default:Information,Override:{Microsoft:Warning,System:Warning}},WriteTo:[{Name:Console},{Name:File,Args:{path:logs/log-.txt,rollingInterval:Day,retainedFileCountLimit:30}}],Enrich:[FromLogContext,WithMachineName,WithThreadId]}}2. 在 ASP.NET CoreProgram.cs中挂载varbuilderWebApplication.CreateBuilder(args);// 声明让 ASP.NET Core 读取配置文件并使用 Serilog 接管官方日志系统builder.Host.UseSerilog((context,services,configuration)configuration.ReadFrom.Configuration(context.Configuration).ReadFrom.Services(services));varappbuilder.Build();// 在 Controller 中即可通过标准 ILoggerT 注入直接使用 Serilog 的强大功能5. 总结学习 Serilog 不仅仅是学会安装一个 NuGet 包更是从传统文本运维向现代化数据驱动运维转变的关键一步。抛弃旧观念不要再使用Console.WriteLine或简单的字符串拼接写日志。掌握核心价值Serilog 的灵魂在于结构化把日志当作带属性的事件数据保存。架构规范业务代码中依赖微软抽象的ILogger通过依赖注入在基础设施层配置 Serilog实现优雅的架构解耦。

相关新闻

2026 苹果安卓手机播放器推荐

2026 苹果安卓手机播放器推荐

在苹果手机和安卓手机上找一款无广告、还能流畅播放 4K 并打通全平台观影进度的播放器,网易爆米花、VLC、nPlayer 和 MX Player 是目前最值得关注的四个选择。其中网易爆米花(https://bmh.163.com/windows/;https://bmh.163.com/mac&#xff…

2026/8/10 8:25:13 阅读更多 →
面向对象编程核心概念与实践指南

面向对象编程核心概念与实践指南

1. 面向对象编程的核心概念回顾 面向对象编程(OOP)是现代软件开发中最基础也最重要的编程范式之一。作为一名有十年经验的开发者,我发现很多程序员虽然每天都在使用OOP,但对它的理解却停留在表面。让我们先回顾几个核心概念&#…

2026/8/10 8:25:13 阅读更多 →
企业级AI Agent安全加固实战:从权限管控到沙箱隔离

企业级AI Agent安全加固实战:从权限管控到沙箱隔离

在企业级AI Agent的部署浪潮中,一个令人担忧的现象正在悄然蔓延:原本作为安全最后一道防线的“Human in the Loop”(人机回环),在许多场景下正退化为一种机械的、不经思考的“确认按钮点击”行为。当操作员因流程繁琐、…

2026/8/10 8:25:13 阅读更多 →

最新新闻

容度原理:一套可以“读取”宇宙任何星体的底层逻辑容度原理的11条原理不是“针对地球物理”或“针对矿物”的特殊规则,它们是自指系统在任意尺度上都必须遵守的普适规律。

容度原理:一套可以“读取”宇宙任何星体的底层逻辑容度原理的11条原理不是“针对地球物理”或“针对矿物”的特殊规则,它们是自指系统在任意尺度上都必须遵守的普适规律。

容度原理:一套可以“读取”宇宙任何星体的底层逻辑容度原理的11条原理不是“针对地球物理”或“针对矿物”的特殊规则,它们是自指系统在任意尺度上都必须遵守的普适规律。基于这个判断,容度原理可以对任何一个天体进行推演——只需要知道它的…

2026/8/10 9:19:06 阅读更多 →
FPGA竞赛全攻略:从零构建硬件项目履历,破解求职与技能提升难题

FPGA竞赛全攻略:从零构建硬件项目履历,破解求职与技能提升难题

如果你是一名电子、通信或计算机专业的学生,或者是一名刚入行的硬件工程师,当听到“FPGA竞赛”这个词时,你的第一反应是什么?是觉得它高不可攀,充满了复杂的时序约束和Verilog代码?还是认为它只是少数“大神…

2026/8/10 9:19:06 阅读更多 →
罗技鼠标宏终极指南:PUBG无后坐力脚本完整配置教程

罗技鼠标宏终极指南:PUBG无后坐力脚本完整配置教程

罗技鼠标宏终极指南:PUBG无后坐力脚本完整配置教程 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 你是否在《绝地求生》中经常因武器…

2026/8/10 9:19:06 阅读更多 →
SpringBoot实训管理系统开发实战与优化技巧

SpringBoot实训管理系统开发实战与优化技巧

1. 项目概述:SpringBoot实训管理系统的核心价值 作为一名经历过毕业设计煎熬的老程序员,我深知选题的重要性。这个基于SpringBoot的实训管理系统,本质上是要解决高校实训教学中的三大痛点:过程管理混乱、数据统计困难、师生互动低…

2026/8/10 9:19:06 阅读更多 →
容度原理的11条核心原理(P1-P11)为推演月球矿藏提供了系统性框架。以下是容度原理基于其11条原理及宇宙视角,推测出的可能改变地球格局的月球矿藏类型——这些矿藏与现有顶刊论文提出的完全不同。

容度原理的11条核心原理(P1-P11)为推演月球矿藏提供了系统性框架。以下是容度原理基于其11条原理及宇宙视角,推测出的可能改变地球格局的月球矿藏类型——这些矿藏与现有顶刊论文提出的完全不同。

容度原理的11条核心原理(P1-P11)为推演月球矿藏提供了系统性框架。以下是容度原理基于其11条原理及宇宙视角,推测出的可能改变地球格局的月球矿藏类型——这些矿藏与现有顶刊论文提出的完全不同。一、容度原理推测月球可能存在的“地球格局级…

2026/8/10 9:19:06 阅读更多 →
容度原理终极推演:月球上的“文明级”资源全图谱——11条原理指向的六大颠覆性资源

容度原理终极推演:月球上的“文明级”资源全图谱——11条原理指向的六大颠覆性资源

容度原理终极推演:月球上的“文明级”资源全图谱——11条原理指向的六大颠覆性资源基于容度原理的完整推演,月球上除了黄金和氦-3聚变矿外,还存在以下几类足以重塑人类文明的“文明级”资源。它们不是“发现”,而是被容度场锁定在…

2026/8/10 9:18:05 阅读更多 →

日新闻

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南 【免费下载链接】graphql-css A blazing fast CSS-in-GQL™ library. 项目地址: https://gitcode.com/gh_mirrors/gr/graphql-css GraphQL-CSS是一个基于GraphQL的CSS-in-GQL™库&#xff0…

2026/8/10 0:00:02 阅读更多 →
告别语言障碍:KISS Translator 双语翻译插件终极指南

告别语言障碍:KISS Translator 双语翻译插件终极指南

告别语言障碍:KISS Translator 双语翻译插件终极指南 【免费下载链接】kiss-translator A simple, open source bilingual translation extension & Greasemonkey script (一个简约、开源的 双语对照翻译扩展 & 油猴脚本) 项目地址: https://gitcode.com/…

2026/8/10 0:00:02 阅读更多 →
BepInEx配置管理器:游戏插件配置的终极可视化解决方案

BepInEx配置管理器:游戏插件配置的终极可视化解决方案

BepInEx配置管理器:游戏插件配置的终极可视化解决方案 【免费下载链接】BepInEx.ConfigurationManager Plugin configuration manager for BepInEx 项目地址: https://gitcode.com/gh_mirrors/be/BepInEx.ConfigurationManager 你是否曾经因为游戏插件的复杂…

2026/8/10 0:00:02 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/10 1:05:29 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/10 1:05:29 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/10 1:05:29 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/9 17:05:02 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/10 1:05:29 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/9 17:05:02 阅读更多 →