Layout.WatchDog.NET 1.5.0-beta.3 发布:统一全后端雪花 ID 策略,数据库能力矩阵一览
一个专为
ASP.NET Core设计的轻量级、实时、可落地的应用日志和资源监控 "看门狗"
- NuGet :https://www.nuget.org/packages/Layout.WatchDog.NET/1.5.0-beta.3
- Gitee :https://gitee.com/dolayout/watch-dog
- 协议 :MIT
安装 NuGet 包:
bash
dotnet add package Layout.WatchDog.NET --version 1.5.0-beta.3
一、本版改了什么
1.5.0-beta.3 基于 1.5.0-beta.2,只做一件事:把所有数据库后端的日志主键 ID 统一为应用层雪花算法。没有新功能,没有破坏性变更,是一次"把口径拉齐"的整理版。
为什么要做这次统一
beta.2 之前,不同后端的 ID 生成方式并不一致:
| 后端 | 原来 ID 怎么来 |
|---|---|
| LiteDB / MongoDB | 应用层雪花算法 |
| MSSQL / MySQL / PostgreSQL | 数据库自增列(IDENTITY / AUTO_INCREMENT / BIGSERIAL) |
| SQLite | INTEGER PRIMARY KEY AUTOINCREMENT |
这带来两个问题:
- 清空日志后行为不一致:SQL 自增列清空后会从头开始,导致新记录 ID 小于旧记录,排序错乱;雪花算法则不回退。
- 多实例写入同一库时 :数据库自增列无法跨实例保证全局有序,而雪花算法可以通过
WorkerId隔离。
beta.3 把这条线彻底拉直:无论你用哪种数据库,ID 都由应用层统一生成。
具体改动
1. ID 生成逻辑上提
原来 log.Id = LogIdGenerator.Next() 分散在 LiteDBHelper、MongoDBHelper 各自的 Insert 方法里。现在统一上提到 DynamicDBManager 的三个 Insert 方法(InsertWatchLog / InsertWatchExceptionLog / InsertLog),在进入具体数据库 Helper 之前就分配好 ID。三个 Helper 不再各自赋值,逻辑更集中。
2. SQL 表结构移除自增列
| 后端 | 原来 | 现在 |
|---|---|---|
| MSSQL | BIGINT IDENTITY(1,1) PRIMARY KEY |
BIGINT NOT NULL PRIMARY KEY |
| MySQL | BIGINT AUTO_INCREMENT PRIMARY KEY |
BIGINT NOT NULL PRIMARY KEY |
| PostgreSQL | BIGSERIAL PRIMARY KEY |
BIGINT NOT NULL PRIMARY KEY |
| SQLite | INTEGER PRIMARY KEY AUTOINCREMENT |
INTEGER PRIMARY KEY |
INSERT 语句 首位增加 id 列和 @Id 参数(DbType.Int64),显式写入 雪花 ID。
3. 旧库兼容
CREATE TABLE IF NOT EXISTS不会覆盖已存在的表结构,旧库的自增列定义原样保留。- MSSQL 旧库 :IDENTITY 列默认不允许显式插入。通过在 INSERT 前后包裹
SET IDENTITY_INSERT [table] ON; ...; SET IDENTITY_INSERT [table] OFF;兼容显式写入,旧库无需迁移。 MySQL / PostgreSQL / SQLite旧库的无自增列或非自增主键可直接接收显式 ID,无需特殊处理。
4. 清表操作统一
ClearTableAsync 统一改为 DELETE FROM(PostgreSQL 原来用 TRUNCATE,现统一)。行为与之前一致,只是写法对齐。
兼容性
| 维度 | 说明 |
|---|---|
| 现有用户 | 无感升级。旧库表结构不变,新记录的 ID 会大于旧记录(雪花算法不回退) |
| 新库 | 自动建表时不再带自增列,INSERT 显式写 ID |
| 多实例 | 配置 WorkerId(0-1023)保证全局有序,对所有后端生效 |
| 清空日志 | ID 不回退,排序稳定 |
二、回顾:1.5.0-beta.2 带来了什么
beta.3 是站在 beta.2 肩膀上的整理版。beta.2 的两大核心能力这里只做一句话回顾,详细发布说明见原文:
Layout.WatchDog.NET 1.5.0-beta.2 发布:.NET 实时应用监控再升级,新增资源监控看板与 SQLite 支持
- 独立 Dashboard 看板 :Vue 3.5 + TanStack + Tailwind 实现的现代化监控面板,含服务器资源监控(
CPU / 内存 / 磁盘 / 网络 / GC / 运行时),支持深色 / 浅色 / 中英文切换,默认关闭,启用后挂载到可配BasePath。 - SQLite 驱动支持 :与
LiteDB同属零运维单文件存储,但可用标准 SQL 工具直接查日志,自动开启WAL / busy_timeout / synchronous=NORMAL。
三、数据库能力矩阵
这是 1.5.0-beta.3 之后,Layout.WatchDog.NET 支持的 6 种数据库后端的全景对照。选型时可以直接对着这张表看。
能力矩阵
| 数据库 | 类型 | 是否需独立服务 | 自动建表/集合 | 时间列存储 | 压缩支持 | ID 策略 | 多实例同库 | 适用场景 |
|---|---|---|---|---|---|---|---|---|
| LiteDB | 嵌入式文档 | 否 | 自动建集合 | DateTime | Compact(Rebuild) | 雪花算法 | 不建议 | 默认;单机小应用、零运维 |
| SQLite | 嵌入式关系 | 否 | 自动建表 | TEXT(ISO 8601) | VACUUM | 雪花算法 | 不建议 | 单机、需用 SQL 工具查日志 |
| MSSQL | 关系型 | 是 | 自动建表 | VARCHAR(100) | --- | 雪花算法 | 支持 | 企业已有 SQL Server 基础设施 |
| MySQL | 关系型 | 是 | 自动建表 | VARCHAR(100) | --- | 雪花算法 | 支持 | 企业已有 MySQL 基础设施 |
| PostgreSQL | 关系型 | 是 | 自动建表 | timestamptz | --- | 雪花算法 | 支持 | 企业已有 PG 基础设施、强类型时间 |
| MongoDB | 文档型 | 是 | 自动建集合 | DateTime | --- | 雪花算法 | 支持 | 高并发、文档模型偏好 |
关键说明
- ID 策略 :
beta.3起,6 种后端全部 由应用层雪花算法生成(41 位毫秒 + 10 位 Worker ID + 12 位序列号),清空日志后 ID 不回退。SQL 后端的 id 列是普通BIGINT/INTEGER PRIMARY KEY(无自增),INSERT 时显式写入。 - 时间统一 UTC :MSSQL / MySQL / SQLite 存
ISO 8601 字符串,PostgreSQL 存原生timestamptz,LiteDB / MongoDB 存DateTime。 - 自动建表:启动时自动创建,无需手动迁移。旧库表已存在不会重建。
- 搜索参数化 :所有搜索条件走参数化查询,无 SQL 注入风险。
- 压缩 :
仅 LiteDB(Compact)与 SQLite(VACUUM)支持,清空日志后自动执行,也可手动调GET /WTCHDwatchpage/Compact。
关于数据库接入方式,详细信息请查看:https://gitee.com/dolayout/watch-dog/blob/master/docs/database-backends.md
依赖版本(按目标框架区分)
| NuGet 包 | .NET 8 | .NET 10 |
|---|---|---|
Microsoft.Data.Sqlite |
8.0.33 | 10.0.14 |
Npgsql |
8.0.9 | 10.0.3 |
MySql.Data |
9.7.0 | 26.10.0 |
Microsoft.Data.SqlClient |
7.1.1(统一) | 7.1.1(统一) |
MongoDB.Driver |
3.13.0(统一) | 3.13.0(统一) |
LiteDB.Queryable |
10.0.2(统一) | 10.0.2(统一) |
选型建议
| 场景 | 推荐 |
|---|---|
| 单机小应用、不想装数据库 | LiteDB(默认)或 SQLite |
| 已有 SQL Server 基础设施 | MSSQL |
| 已有 MySQL 基础设施 | MySQL |
| 已有 PG 基础设施、偏好强类型时间 | PostgreSQL |
| 高并发、文档模型偏好 | MongoDB |
| 想用 SQL 工具直接查日志 | SQLite / MSSQL / MySQL / PostgreSQL |
| 多实例同库 | MSSQL / MySQL / PostgreSQL / MongoDB |
四、快速接入
1. 安装
bash
dotnet add package Layout.WatchDog.NET --version 1.5.0-beta.3
2. 注册服务(零配置默认 LiteDB)
csharp
builder.Services.AddWatchDogServices();
切换到其他数据库:
csharp
builder.Services.AddWatchDogServices(opt =>
{
opt.DbDriverOption = WatchDogDbDriverEnum.Sqlite;
opt.SetExternalDbConnString = "Data Source=watchdog.db";
});
3. 配置中间件
csharp
var app = builder.Build();
app.UseWatchDogExceptionLogger();
app.UseWatchDog(opt =>
{
opt.WatchPageUsername = "admin";
opt.WatchPagePassword = "Qwerty@123";
// 启用独立 Dashboard(可选)
opt.Dashboard.Enabled = true;
});
4. 打业务日志
csharp
using WatchDog;
WatchLogger.Log("用户登录成功");
WatchLogger.LogWarning("请求频率过高");
WatchLogger.LogError("处理订单失败", eventId: "Order_001");
5. 打开看板
启动应用后访问 /watchdog,登录即可看到 HTTP 请求 / 响应、异常堆栈、业务日志、服务器资源总览,全部实时刷新。
五、多实例写入安全
beta.3 统一 ID 策略后,多实例写同一库的场景更干净了:
csharp
services.AddWatchDogServices(opt =>
{
opt.WorkerId = 1; // 0-1023,同一个库上的每个进程必须不同
});
或用环境变量:
bash
# Linux / macOS
WATCHDOG_WORKER_ID=2 dotnet MyApp.dll
# Windows PowerShell
$env:WATCHDOG_WORKER_ID = 2
- 所有后端生效 :
LiteDB / SQLite / MSSQL / MySQL / PostgreSQL / MongoDB配置此项均有效。 - ID 不回退 :清空日志或压缩数据文件后,新记录
ID依然大于旧记录,排序不错乱。 - 旧库升级 :
LiteDB中Int32的历史记录首次打开时自动宽化为Int64;SQL旧INT自增列与MongoDB存量数据均无需迁移。
六、和上游 WatchDog.NET 的区别
| 维度 | 上游 WatchDog.NET | Layout.WatchDog.NET |
|---|---|---|
| 维护状态 | 1.4.12 存在依赖安全隐患 | 持续维护 |
| .NET 10 | 不完整 | 官方支持 |
| SQLite | 不支持 | 支持 |
| 独立看板 | 无(内置 WatchPage 有技术债) | Vue3 Dashboard + 兼容 WatchPage |
| 资源监控 | 无 | CPU / 内存 / 磁盘 / 网络 / GC |
| ID 生成 | 自增(SQL 后端) | 全后端统一雪花 ID |
| 多实例 | 一般 | WorkerId 显式隔离 |
| 清理压缩 | LiteDB 不完整 | LiteDB + SQLite 自动压缩 |
七、版本说明
当前版本 :Layout.WatchDog.NET 1.5.0-beta.3
状态:
- 预发布版本
- 适合试用、内部环境、非强依赖生产
- 建议生产使用前做一轮压测与权限审计
版本演进:
| 版本 | 核心内容 |
|---|---|
1.5.0-beta.1 |
包 ID 切换为 Layout.WatchDog.NET;数据库层分页、统一 UTC、LiteDB 自动压缩、雪花 ID(仅 LiteDB/Mongo)、SQL 参数化、net8.0 + net10.0 双目标 |
1.5.0-beta.2 |
新增独立 Dashboard 看板(含服务器资源监控);新增 SQLite 驱动;NuGet 依赖按 TFM 区分版本;DescribeDriver 返回值统一小写 |
1.5.0-beta.3 |
统一所有后端 ID 策略为应用层雪花算法;SQL DDL 移除自增列;MSSQL 兼容旧库 IDENTITY 列;清表统一 DELETE FROM;新增中英文数据库接入文档 |
如遇到问题:
- 欢迎提交
issue:https://gitee.com/dolayout/watch-dog/issues - 或者
fork本仓库 → 创建特性分支 → 提交更改 → 推送 → 发起Pull Request
八、一句话总结
Layout.WatchDog.NET 1.5.0-beta.3 = 在 beta.2 的基础上,把 6 种数据库后端的 ID 策略彻底拉齐为应用层雪花算法,清空不回退、多实例可隔离、旧库免迁移。
如果你正在找一个:
- 不重,轻量级,MIT 协议开源
- 不贵,支持商业和个人任意用途免费使用
- 不依赖外部服务(默认 LiteDB 零配置)
- 能直接嵌进 ASP.NET Core
- 支持 6 种数据库后端,ID 策略全局统一
- 开发看日志、运维看资源都够用
的监控组件,欢迎体验 Layout.WatchDog.NET。