DuMes.Component.Serilog
6.0.1
dotnet add package DuMes.Component.Serilog --version 6.0.1
NuGet\Install-Package DuMes.Component.Serilog -Version 6.0.1
<PackageReference Include="DuMes.Component.Serilog" Version="6.0.1" />
<PackageVersion Include="DuMes.Component.Serilog" Version="6.0.1" />
<PackageReference Include="DuMes.Component.Serilog" />
paket add DuMes.Component.Serilog --version 6.0.1
#r "nuget: DuMes.Component.Serilog, 6.0.1"
#:package DuMes.Component.Serilog@6.0.1
#addin nuget:?package=DuMes.Component.Serilog&version=6.0.1
#tool nuget:?package=DuMes.Component.Serilog&version=6.0.1
DuMes.Component.Serilog
多脉日志组件:接入 Microsoft.Extensions.Logging.ILogger 管道,按环境与级别分流到 Debug 窗口 / 彩色控制台 / 文件。
项目结构
DuMes.Component.Serilog/
├── Constants/ # LogProperties、LogWriteTarget
├── DependencyInjection/ # UseComponentSerilog / AddComponentSerilog
├── Logging/ # WriteInformation / WriteWarning / WriteError
├── Options/ # SerilogComponentOptions
└── Internal/
├── Configuration/ # Serilog 管道构建
├── Enrichers/ # 文件路由
├── Writing/ # 持久化公共逻辑
└── Utilities/ # 路径清洗
功能概览
| 能力 | 说明 |
|---|---|
| 管道接入 | WebAPI / 控制台 Host / 纯 DI,与 ILogger<T> 共用同一管道 |
| 环境感知 | Development:最低 Debug;其他环境:最低 Information |
| 落盘 API | WriteInformation / WriteWarning / WriteError(须指定文件名) |
| 写入目标 | LogWriteTarget.File(默认);Database 预留未实现 |
| 根目录 | 固定 {AppContext.BaseDirectory}/logs/(绝对路径,不可配置) |
| 控制台 | Information+(可经 EnableConsole 关闭);仅 Level / 属性值着色 |
输出路由
| 级别 | Debug 窗口 | 控制台 | 文件(仅 Write*) |
|---|---|---|---|
| Debug(仅 Development) | ✓ | ✗ | ✗ |
| Information+ | ✗ | ✓ | ✓ |
LogInformation/LogWarning/LogError不落盘;只有Write*且指定了fileName才会写文件。
文件路径规则
directory |
路径 |
|---|---|
| 空 / 省略 | {BaseDirectory}/logs/{fileName}.log |
| 非空 | {BaseDirectory}/logs/{directory}/{fileName}{yyyyMMddHH}.log |
BaseDirectory 即 AppContext.BaseDirectory(一般为 bin/Debug/net10.0/),与进程当前工作目录无关。
有业务目录时,该目录下按 MaxFilesPerFolder / FileSizeLimitBytes 滚动保留。
输出格式
控制台与文件使用同一模板:
[{Timestamp:yyyy-MM-dd HH:mm:ss.ffff} {Level:u3}] {Message:lj}
{Exception}
示例:[2026-08-06 00:27:35.6166 INF] 正在加载 …
控制台使用 AnsiConsoleTheme.Code:仅 级别 与消息中的 属性值 着色,正文保持默认色;文件为纯文本(无 ANSI)。
引用
项目引用或 NuGet 引用本组件即可。ILogger 由 Serilog.AspNetCore 传递引入,不必再单独安装 Microsoft.Extensions.Logging。
using DuMes.Component.Serilog; // Write*、UseComponentSerilog、LogWriteTarget
using Microsoft.Extensions.Logging; // ILogger<T>、LogInformation 等
接入
WebAPI
Program.cs 配置 Host 管道(内部会注册进 DI);调用返回后即可使用静态 Log,业务类也可注入 ILogger<T>。不要再调 AddComponentSerilog。
using Serilog;
var builder = WebApplication.CreateBuilder(args);
// 须在读取 SerilogComponent 配置之后调用;注册完成后立刻可用 Log.*
builder.Host.UseComponentSerilog(builder.Configuration, builder.Environment);
Log.Information("Serilog 已就绪");
builder.Services.AddControllers();
var app = builder.Build();
app.MapControllers();
try
{
app.Run();
}
finally
{
await Log.CloseAndFlushAsync();
}
public class OrderController(ILogger<OrderController> logger) : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
logger.WriteInformation("api", "处理请求"); // logs/api.log
logger.WriteInformation("biz", "处理订单", "order"); // logs/order/bizyyyyMMddHH.log
return Ok();
}
}
控制台 + Generic Host
using Serilog;
var builder = Host.CreateApplicationBuilder(args);
builder.UseComponentSerilog(); // 注册后即可 Log.*
Log.Information("Serilog 已就绪");
var host = builder.Build();
await host.RunAsync();
控制台仅 DI(无 Host)
configuration 可省略(用代码默认值)。结束前建议 Log.CloseAndFlush()。
using Serilog;
services.AddComponentSerilog();
services.AddComponentSerilog(configuration);
services.AddComponentSerilog(o => o.MaxFilesPerFolder = 50);
// ...
Log.CloseAndFlush();
环境由 ASPNETCORE_ENVIRONMENT / DOTNET_ENVIRONMENT 判断(Development 即开发模式)。
记录日志
// 不落盘(管道默认行为)
logger.LogDebug("仅 Debug 窗口");
logger.LogInformation("仅控制台(Development)");
logger.LogWarning("警告(不落盘)");
logger.LogError(ex, "错误(不落盘)");
// 落盘:Write*(directory / target 可选,默认 File)
logger.WriteInformation("start", "写入 logs/start.log");
logger.WriteInformation("biz", "写入日志", "order");
logger.WriteInformation("biz", "写入文件", "order", LogWriteTarget.File);
// logger.WriteInformation("biz", "写入库", "order", LogWriteTarget.Database); // 尚未实现
logger.WriteWarning("start", "警告");
logger.WriteWarning("biz", "警告", "order");
logger.WriteError("start", "错误");
logger.WriteError(ex, "start", "带异常的错误");
logger.WriteError(ex, "biz", "带异常的错误", "order", LogWriteTarget.File);
| API | 作用 |
|---|---|
LogDebug / LogInformation / LogWarning / LogError |
MEL 标准方法,不落盘 |
WriteInformation / WriteWarning / WriteError |
持久化;签名 (fileName, message, directory?, target?, args) |
WriteError(ex, fileName, message, …) |
带异常的 Error 重载 |
LogFile.ClearFixedName(fileName) |
清空 {BaseDirectory}/logs/{fileName}.log 内容(文件不存在则忽略) |
清空固定名日志
仅作用于 logs 根目录下固定名称文件,不影响业务目录滚动文件:
LogFile.ClearFixedName("start"); // 清空 logs/start.log
LogFile.ClearFixedName("error"); // 清空 logs/error.log
配置(可选)
均可省略,代码内已有默认值;需要覆盖时在 appsettings.json 增加:
{
"SerilogComponent": {
"EnableConsole": true,
"MaxFilesPerFolder": 100,
"FileSizeLimitBytes": 10485760
}
}
| 配置项 | 默认值 | 说明 |
|---|---|---|
EnableConsole |
true |
是否写控制台;WinForms/WPF/Windows 服务可关;Docker 建议开 |
MaxFilesPerFolder |
100 |
有业务 directory 时,该目录下最多保留的日志文件数 |
FileSizeLimitBytes |
10485760(10MB) |
有业务 directory 时,单文件大小上限,超出滚动 |
也可用代码覆盖:
builder.Host.UseComponentSerilog(builder.Configuration, builder.Environment, o =>
{
o.EnableConsole = false; // 无黑窗口 / 服务场景
o.MaxFilesPerFolder = 50;
});
说明
- WebAPI 为何是
Host.UseComponentSerilog(configuration, environment): 官方 Serilog 接法是配置 Host 日志管道;本组件在注册时创建并赋值Log.Logger,再UseSerilog(logger)接入 DI,故Build()前即可Log.Information,与注入的ILogger<T>同一实例。 - 为何不叫
LogInformation(fileName, …): 会与 MEL 实例方法重载冲突,扩展无法被调用,故使用Write*。 LogWriteTarget.Database: 枚举已预留,调用会抛出NotSupportedException,后续扩展写入库。- 静态
Log: 与ILogger共用同一Logger实例;结束时请Log.CloseAndFlush()/CloseAndFlushAsync()。
示例工程
| 工程 | 说明 |
|---|---|
TestSerilog |
控制台:启动清空固定名日志后写入并打印文件 |
TestSerilogWebApi |
WebAPI:builder.Host.UseComponentSerilog(configuration, environment),请求 GET /test/logs 验证 |
# 控制台
cd TestSerilog && dotnet run
# WebAPI(默认 http://localhost:5090)
cd TestSerilogWebApi && dotnet run
curl http://127.0.0.1:5090/test/logs
# 发布后运行(publish 目录不含 launchSettings,需自行指定端口/环境)
dotnet publish TestSerilogWebApi -c Release -o ./publish
cd publish
ASPNETCORE_URLS=http://localhost:5090 dotnet TestSerilogWebApi.dll
curl http://127.0.0.1:5090/test/logs
直接
dotnet xxx.dll时默认 Production;控制台为 Information+。launchSettings.json不会打进发布包,需自行指定--urls/ASPNETCORE_URLS。
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Microsoft.Extensions.Configuration.Binder (>= 10.0.10)
- Serilog.AspNetCore (>= 10.0.0)
- Serilog.Sinks.Async (>= 2.1.0)
- Serilog.Sinks.Console (>= 6.1.1)
- Serilog.Sinks.Debug (>= 3.0.0)
- Serilog.Sinks.File (>= 7.0.0)
- Serilog.Sinks.Map (>= 2.0.0)
NuGet packages (3)
Showing the top 3 NuGet packages that depend on DuMes.Component.Serilog:
| Package | Downloads |
|---|---|
|
DuMes.Component.Database
多脉数据库组件:基于 SqlSugar.IOC 提供统一 DI 注册、多库导航、读写分离与 SQL AOP(依赖 DuMes.Component.Serilog) |
|
|
DuMes.Component.I18N
多脉本地化组件:按固定目录约定加载 JSON 文案,通过泛型资源类型 + 点号键解析多语言文本,并支持浏览器 Accept-Language。 |
|
|
DuMes.Component.FusionCache
多脉缓存组件:基于 FusionCache 提供 L1 内存 + 可选 L2 Redis(CSRedis)混合缓存 |
GitHub repositories
This package is not used by any popular GitHub repositories.