C#中Serilog快速上手_C#结构化日志框架教程【推荐】

裘德小鎮的故事

裘德小鎮的故事

2026-05-19

424人浏览

原创

必须调用builder.host.useserilog()将serilog挂入di生命周期,否则ilogger注入的是默认日志器;log.logger静态初始化与di无关;writeto至少需一个sink且路径含-或.才滚动;结构化日志需严格匹配字段名、大小写及{@}语法。

c#中serilog快速上手_c#结构化日志框架教程【推荐】

直接在 Program.cs 顶部初始化 Log.Logger,并调用 builder.Host.UseSerilog(),否则 ILogger<t></t> 注入的永远是 Microsoft 默认日志器,不是 Serilog。

为什么 ILogger 注入的是空壳?

根本原因不是配置写错了,而是 Serilog 没被挂进 DI 生命周期。ASP.NET Core 启动时会先创建自己的 ILoggerFactory,如果你没显式调用 UseSerilog(),它就完全不感知 Serilog 的存在。

  • Log.Logger = new LoggerConfiguration().CreateLogger() 只是建了个静态实例,和 DI 容器无关
  • builder.Services.AddLogging(...) 手动注册也无效——必须走 builder.Host.UseSerilog()
  • 常见现象:控制器里 ILogger<weathercontroller></weathercontroller> 能注入成功,但 Log.Information() 写不到文件、控制台没输出、LogContext.PushProperty() 完全不生效

WriteTo 配置后日志仍不落地?

Serilog 默认静默失败:没配 sink 就不输出,也不报错。哪怕你写了 Log.Information("test"),路径权限不足、磁盘满、目录不存在,它都一声不吭。

C函数速查手册(CHM版)
C函数速查手册(CHM版)

C函数速查手册(CHM版)

下载
  • 必须至少配置一个 sink:.WriteTo.Console().WriteTo.File("logs/app-.log")
  • 文件路径中必须含 -. 才触发滚动(如 "logs/app-.log"app-20260514.log;而 "logs/app.log" 永远只写一个文件)
  • Windows 下路径权限问题高发:确保应用对 logs/ 目录有写权限,否则 .WriteTo.File() 直接失效

结构化日志为什么查不到字段?

不是“写了占位符就自动结构化”,而是字段名、大小写、参数顺序三者必须严丝合缝,且 sink 必须支持结构化传输。

  • 错误写法:Log.Information($"User {id} logged in") → 输出纯文本,无 Properties 字段
  • 正确写法:Log.Information("User {UserId} logged in", id)UserId 是字段名,区分大小写
  • 传对象必须用 {@User}(带 @),否则只调 .ToString(),序列化不出属性
  • 推送到 Seq/Elasticsearch 时,若没装对应 sink(如 Serilog.Sinks.Seq)或没配地址/ApiKey,日志会丢得毫无痕迹

appsettings.json 配置不生效?

Serilog.Settings.Configuration 不是自动加载,它只读 "Serilog" 节点,且必须显式调用 .ReadFrom.Configuration()

  • 缺 NuGet 包:Serilog.Settings.Configuration 必须安装
  • 缺调用:.ReadFrom.Configuration(builder.Configuration) 必须加在 LoggerConfiguration 链中
  • JSON 结构要完整:"Serilog" 是顶层键,不能嵌在 "Logging" 下;"WriteTo" 是数组,每个项必须有 "Name"
  • 示例有效片段:
    {
      "Serilog": {
        "MinimumLevel": "Debug",
        "WriteTo": [
          { "Name": "Console" },
          { "Name": "File", "Args": { "path": "logs/app-.log", "rollingInterval": "Day" } }
        ]
      }
    }

最常被忽略的一点:日志级别过滤和 sink 级别控制是两回事。全局 MinimumLevel.Debug() 只决定“哪些日志事件被创建”,而 restrictedToMinimumLevel: Warning 才决定“该 sink 是否接收这条日志”。不设这个,控制台刷满 Debug,文件却漏掉关键上下文——这不是 bug,是设计如此。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c#

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

528

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

1180

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

556

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

1051

11

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2026.02.03

148

18

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

202

20

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

2026.03.11

526

24

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

2026.04.13

138

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

Linux man-pages 项目
Linux man-pages 项目

共0课时 | 0人学习

C# 教程
C# 教程

共94课时 | 20.2万人学习