Layout.WatchDog.NET 1.5.0-beta.3 发布:统一全后端雪花 ID 策略,数据库能力矩阵一览

Layout.WatchDog.NET 1.5.0-beta.3 发布:统一全后端雪花 ID 策略,数据库能力矩阵一览

一个专为 ASP.NET Core 设计的轻量级、实时、可落地的应用日志和资源监控 "看门狗"

安装 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

这带来两个问题:

  1. 清空日志后行为不一致:SQL 自增列清空后会从头开始,导致新记录 ID 小于旧记录,排序错乱;雪花算法则不回退。
  2. 多实例写入同一库时 :数据库自增列无法跨实例保证全局有序,而雪花算法可以通过 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;新增中英文数据库接入文档

如遇到问题:


八、一句话总结

Layout.WatchDog.NET 1.5.0-beta.3 = 在 beta.2 的基础上,把 6 种数据库后端的 ID 策略彻底拉齐为应用层雪花算法,清空不回退、多实例可隔离、旧库免迁移。

如果你正在找一个:

  • 不重,轻量级,MIT 协议开源
  • 不贵,支持商业和个人任意用途免费使用
  • 不依赖外部服务(默认 LiteDB 零配置)
  • 能直接嵌进 ASP.NET Core
  • 支持 6 种数据库后端,ID 策略全局统一
  • 开发看日志、运维看资源都够用

的监控组件,欢迎体验 Layout.WatchDog.NET。

相关推荐
IT规划师1 小时前
MQTT 实战 - 放下炫技,8 年踩坑的真心话与方法论(收官)
物联网·.net
CSharp精选营1 小时前
.NET 接口从 800ms 干到 60ms:生产环境这几个优化点最关键
性能优化·c#·.net·efcore
CSharp精选营1 天前
制造业 ERP 物料建模:主料、辅料和 BOM 到底怎么拆才稳
.net·erp·bom·制造业·物料建模
玩泥巴的2 天前
在飞书 SDK 上用 Microsoft Agent Framework 搭一个能干活的工作搭子
ai·.net·飞书·agent
波力海苔夹心脆6752 天前
C# 委托与事件详解:委托声明、Action/Func、多播、event 与 EventHandler 入门教程
开发语言·c#·.net·上位机·委托·事件
IT规划师2 天前
MQTT实战 - MQTT 5.0新特性实战:共享订阅、Topic Alias、流控(十)
物联网·.net
玩泥巴的3 天前
一份声明,多份产物:飞书 SDK 的 AI 工具面是怎么生成的
ai·.net·飞书·agent
IT规划师3 天前
MQTT实战 - .NET + MQTT生产级架构:从500个设备到50,000个设备(九)
物联网·.net