Layout.WatchDog.NET 1.5.0-beta.1

This is a prerelease version of Layout.WatchDog.NET.
There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package Layout.WatchDog.NET --version 1.5.0-beta.1
                    
NuGet\Install-Package Layout.WatchDog.NET -Version 1.5.0-beta.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Layout.WatchDog.NET" Version="1.5.0-beta.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Layout.WatchDog.NET" Version="1.5.0-beta.1" />
                    
Directory.Packages.props
<PackageReference Include="Layout.WatchDog.NET" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Layout.WatchDog.NET --version 1.5.0-beta.1
                    
#r "nuget: Layout.WatchDog.NET, 1.5.0-beta.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Layout.WatchDog.NET@1.5.0-beta.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Layout.WatchDog.NET&version=1.5.0-beta.1&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=Layout.WatchDog.NET&version=1.5.0-beta.1&prerelease
                    
Install as a Cake Tool

WatchDog

WatchDog 版本 下载量 MIT 许可证

简介

WatchDog 是一个专为 ASP.NET Core Web 应用程序和 API 设计的实时消息、事件、HTTP(请求和响应)和异常记录器和查看器。它允许开发人员记录和查看消息、事件、对其 Web 应用程序的 HTTP 请求以及在运行时捕获的异常,全部实时显示。

WatchDog 利用 SignalR 实现实时通信,默认使用轻量级数据库 LiteDB(无需配置),同时支持扩展至外部数据库(MSSQL, MySQL, PostgreSQL, MongoDB)。

主要功能

  • 实时 HTTP 监控:记录所有请求和响应的详细信息。
  • 异常捕获:自动捕获并记录应用程序运行时的异常。
  • 代码内日志:支持在业务代码中手动记录消息和事件。
  • 实时仪表盘:提供 Web 界面 (/watchdog) 查看日志,支持搜索和过滤。
  • 多种数据库支持:内置 LiteDB,支持一键切换至主流关系型数据库和 MongoDB。
  • 日志自动清理:支持配置定时自动清理旧日志。

截图预览

  • 登录页面

Login

  • 请求与响应查看器

请求和响应查看器

  • 异常日志示例

异常示例详情

安装

方式一:.NET CLI

你需要安装 Layout.WatchDog.NET 包。在终端运行:

dotnet add package Layout.WatchDog.NET --version 1.5.0

方式二:NuGet 包管理器

除了 dotnet cli 安装,还可以通过 nuget 包管理器安装:

Install-Package Layout.WatchDog.NET --version 1.5.0

方式三:源码编译(可选)

本仓库以 Layout.WatchDog.NET 为包 ID 发布持续维护的版本,同时面向 .NET 8 与 .NET 10 编译。上游 WatchDog.NET 的最新公开版本 1.4.12 存在已知依赖安全隐患,请勿继续使用。

如果你需要自行打包(例如发布到内部 NuGet 源),版本号定义在 src/WatchDog/WatchDog.csproj 中:

# 克隆仓库
git clone https://gitee.com/dolayout/watch-dog.git
cd watch-dog
# 打包
dotnet pack src/WatchDog/WatchDog.csproj -c Release -o ./artifacts

快速开始

1. 注册服务

在 Program.cs 中注册 WatchDog 服务。

using WatchDog;

// 在 Program.cs 中 (适用于 .NET 6+)
builder.Services.AddWatchDogServices();

2. 配置中间件

在 HTTP 请求管道中启用 WatchDog 中间件。注意顺序非常重要。

var app = builder.Build();

// 使用 WatchDog 异常记录器
app.UseWatchDogExceptionLogger();
...

// 建议在 UseRouting, UseAuthentication, UseAuthorization 之后添加
app.UseWatchDog(opt =>
{
   // 设置查看器的登录账号
   opt.WatchPageUsername = "admin";
   opt.WatchPagePassword = "Qwerty@123";
});

注意:在主要 WatchDog 中间件之前添加异常记录器,最好是在中间件层次结构的顶部,以便捕获可能的早期异常。

3. 查看日志

启动你的应用程序,访问 /watchdog 路径(例如:https://localhost:5000/watchdog),使用配置的用户名和密码登录即可查看实时日志。

进阶配置

设置外部数据库(可选)

WatchDog 默认使用 LiteDB。如果需要使用 MySQL, PostgreSQL, MSSQL 或 MongoDB,请按以下方式配置:

services.AddWatchDogServices(opt =>
{
   // 选择数据库驱动类型
   opt.DbDriverOption = WatchDogDbDriverEnum.PostgreSql;
   // 设置外部数据库连接字符串
   opt.SetExternalDbConnString = "Server=localhost;Database=WatchDogDb;User Id=postgres;Password=root;";
});

设置自动清除日志(可选)

services.AddWatchDogServices(opt =>
{
   opt.IsAutoClear = true; // 开启自动清除
   opt.ClearTimeSchedule = WatchDogAutoClearScheduleEnum.Weekly; // 清除频率,默认每周
});

手动压缩 LiteDB 数据文件(仅 LiteDB)

LiteDB 的 DeleteAll 只是把数据页标记为空闲,数据文件本身不会变小。清空日志后如果不重写文件,watchdog.db 会一直保持它曾经达到的最大体积。

ClearLogs 与后台自动清理在删除成功后会各自自动压缩一次,因此日常使用无需干预。下面这个端点用于手动触发,仅在内置 LiteDB 下有效:

GET /WTCHDwatchpage/Compact

需要先登录查看器(与日志页面共用会话),返回 JSON 布尔值。压缩只重写数据文件,不会删除任何日志记录。

# 1. 登录并保存会话 Cookie
curl -c cookies.txt -X POST "https://localhost:5000/WTCHDwatchpage/Auth" \
     --data-urlencode "username=admin" \
     --data-urlencode "password=Qwerty@123"

# 2. 触发压缩
curl -b cookies.txt "https://localhost:5000/WTCHDwatchpage/Compact"
# => true

返回 false 的常见原因:

  • 数据文件不存在(还没有写入过日志)。
  • 有其它进程以非共享方式占用了文件,例如 LiteDB Studio 直接打开了 watchdog.db,或另一个应用实例正在运行。关掉占用方后重试即可。
  • 使用的是 SQL 或 MongoDB 后端。这两种后端不需要压缩,该端点恒返回 false。

调用前请注意:压缩期间会阻塞所有日志读写,数据库越大耗时越长(几十 MB 级别为秒级);过程中还会生成一个约等于原库大小的备份文件、完成后自动删除,因此瞬时磁盘占用接近翻倍。建议在业务低峰执行。

适用场景:

  • 升级后一次性治理:旧版本清空日志不压缩,长期运行过的实例文件已经膨胀。升级后可调用一次回收这部分空间,且无需丢弃当前日志。
  • 磁盘空间告急:需要立即腾出空间,同时希望保留最近的日志用于排查。

实测参考:50 条日志的数据库清空前后均为 90112 bytes,压缩后降至 40960 bytes。

多实例部署:设置 Worker ID(可选)

日志记录的 Id 不再由数据库自增,而是由应用生成一个 64 位整数(雪花算法:41 位毫秒时间 + 10 位 Worker ID + 12 位序列号)。因此即使清空日志或压缩 LiteDB 数据文件,新记录的 Id 依然大于旧记录,排序不会错乱。

单进程、单机部署无需配置:默认的 Worker ID 由机器名哈希与进程号推导得到。

只有多个进程写入同一个数据库时(同一个 LiteDB 文件的多个共享连接,或多个实例连同一个 MongoDB 库),才需要显式指定,以保证 Id 全局有序:

services.AddWatchDogServices(opt =>
{
   opt.WorkerId = 1; // 0-1023,同一个库上的每个进程必须不同
});

也可以不改代码,用环境变量为每个实例注入:

# Linux / macOS
WATCHDOG_WORKER_ID=2 dotnet MyApp.dll
# Windows PowerShell
$env:WATCHDOG_WORKER_ID = 2

说明:

  • 取值范围 0-1023,超出会被限制到该区间;代码中的显式配置优先于环境变量。
  • 仅 LiteDB 与 MongoDB 使用该生成器;MSSQL / MySQL / PostgreSQL 使用数据库自增列,配置此项不会生效。
  • Worker ID 冲突的后果仅限于两个进程之间的 Id 排序可能交错,日志本身不会丢失或错乱。
  • Id 是 64 位整数,超过 JavaScript 的安全整数范围(2^53)。如果需要在浏览器端读取 Id,请按字符串传输,否则会丢精度。WatchDog 自带页面不读取该字段。
  • 需要从 Id 反推生成时间时,id >> 22 即为相对 2024-01-01 UTC 的毫秒数。

从旧版本升级:LiteDB 中 Id 为 Int32 的历史记录会在首次打开数据库时自动宽化为 Int64,数据不丢失;旧记录的 Id 数值本身不变,因此会排在新记录之后。SQL 的旧 INT 自增列与 MongoDB 的存量数据均无需迁移。

可选配置项

在 app.UseWatchDog() 中可以配置更多选项:

app.UseWatchDog(opt =>
{
   opt.WatchPageUsername = "admin";
   opt.WatchPagePassword = "Qwerty@123";

   // 可选配置项:
   // 黑名单:逗号分隔的路径,不记录这些指定 Endpoint 端点/接口
   opt.Blacklist = "Test/testPost, api/auth/login";
   // JSON 序列化器:WatchDog 默认使用内置的 System.Text.Json(无需额外配置)
   // opt.Serializer = WatchDogSerializerEnum.Newtonsoft; // 已废弃,Newtonsoft 不再被使用
   // CORS 策略名称
   opt.CorsPolicy = "MyCorsPolicy";
   // 应用程序使用 asp.net core8+ 输出缓存
   opt.UseOutputCache = true;
   // 启用正则表达式黑名单
   opt.UseRegexForBlacklisting = true;
 });

记录自定义日志

你可以在代码的任何位置调用 WatchLogger 来记录日志:

using WatchDog;

// 记录普通信息
WatchLogger.Log("用户登录成功");

// 记录警告
WatchLogger.LogWarning("请求频率过高");

// 记录错误
WatchLogger.LogError("处理订单失败", eventId: "Order_001");

集成 Microsoft ILogger

你还可以将标准的 ILogger 日志汇总到 WatchDog 中:

// .NET 6+ 在 Program.cs 中配置
builder.Logging.AddWatchDogLogger();

项目结构

该项目主要包含以下模块:

  • src/WatchDog/:核心库源码。
    • src/Controllers/:包含处理日志查看请求的控制器。
    • src/Helpers/:数据库操作辅助类(支持 LiteDB, SQL, MongoDB),以及日志 ID 生成器等工具。
    • src/Hubs/:SignalR 集线器,用于实时推送日志。
    • src/Models/:数据模型定义。
    • src/Services/:后台自动清理服务等。
    • src/WatchPage/:内嵌前端页面(由 /WTCHDGstatics 提供)。
  • tests/Test.WatchDog.API/:API 项目演示。
  • tests/Test.WatchDog.MVC/:MVC 项目演示。

贡献

如果你发现了 Bug 或者希望增加新功能:

  1. Fork 本仓库。
  2. 创建你的特性分支 (git checkout -b feature/AmazingFeature)。
  3. 提交你的更改 (git commit -m 'Add some AmazingFeature')。
  4. 推送到分支 (git push origin feature/AmazingFeature)。
  5. 发起 Pull Request。

致谢


许可证:本项目采用 MIT 许可证。

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (5)

Showing the top 5 NuGet packages that depend on Layout.WatchDog.NET:

Package Downloads
Layout.WatchDog.NET.Storages.SqlServer

WatchDog Storage extension for Microsoft SQL Server. Register with UseSqlServer(connectionString) inside AddWatchDog.

Layout.WatchDog.NET.Storages.MongoDb

WatchDog Storage extension for MongoDB. Register with UseMongoDb(connectionString) inside AddWatchDog.

Layout.WatchDog.NET.Storages.MySql

WatchDog Storage extension for MySQL. Register with UseMySql(connectionString) inside AddWatchDog.

Layout.WatchDog.NET.Storages.PostgreSql

WatchDog Storage extension for PostgreSQL. Register with UsePostgreSql(connectionString) inside AddWatchDog.

Layout.WatchDog.NET.Storages.Sqlite

WatchDog Storage extension for SQLite. Register with UseSqlite(connectionString) inside AddWatchDog.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.5.0-beta.4 0 10/31/2026
1.5.0-beta.3 41 10/29/2026
1.5.0-beta.2 42 10/29/2026
1.5.0-beta.1 42 10/28/2026

1.5.0 - 基于上游 1.4.x 继续维护,包 ID 改为 Layout.WatchDog.NET

上游 WatchDog.NET 的最新公开版本 1.4.12 存在已知依赖安全隐患,请勿继续使用。

破坏性变更
- WatchLog.Id、WatchExceptionLog.Id、WatchLoggerModel.Id 由 int 改为 long
- 移除 Sequence 模型,MongoDB 不再使用独立计数器集合
- MSSQL / MySQL 的时间列改为写入 ISO 8601 UTC 字符串
- 新增对外端点 GET /WTCHDwatchpage/Compact

新增与改进
- 数据库层分页:LiteDB 与 SQL 不再全量加载后在内存分页
- 统一 UTC 时间,序列化强制带 Z,修复前端时间整体偏移
- 清空日志后自动压缩 LiteDB 数据文件,并提供手动压缩端点
- 日志 Id 改用雪花算法,清空或压缩后不再回退
- SQL 筛选条件改为参数化,修复 SQL 注入风险
- 修复 ClearAllLogs 在 SQL 后端恒返回 false 的问题
- 移除 MongoDB 查询中的人为 200ms 延迟
- 支持 net8.0 与 net10.0 双目标