3.5 KiB
3.5 KiB
实时日志查看器设计文档
1. 核心目标
构建一个模态或非模态的 WPF 窗口,用于实时订阅 Serilog 事件,根据预定义的格式(如包含 @l 级别标记)自动渲染颜色,并提供过滤与自动滚动控制。
2. 功能模块规划
为了保证代码的可维护性和复用性,建议采用 MVVM 模式,参考 XP.Common.GeneralForm 的目录结构进行扩展:
text
编辑
XP.Common/
└── GeneralForm/
└── Views/
├── RealTimeLogViewer.xaml // 视图:RichTextBox + 控制栏
└── RealTimeLogViewer.xaml.cs
└── ViewModels/
└── RealTimeLogViewerViewModel.cs // 核心逻辑:处理颜色标记、过滤、滚动
3. 详细功能规格
| 功能模块 | 详细描述 | 交互逻辑 |
|---|---|---|
| 颜色渲染引擎 | 基于 Serilog 标记 解析日志事件中的 Level 或 Message Template。 |
* Error/Fatal: 红色/深红色 * Warning: 橙色/黄色 * Info: 默认色 * Debug: 浅灰色 利用 RichTextBox 的 TextRange 动态追加。 |
| 动态过滤器 | 关键词黑白名单 | * 包含: 仅显示包含关键字的行。 * 排除: 隐藏包含关键字的行。 * 重置: 恢复显示所有。 |
| 智能滚动 | 跟随开关 | * 开启: 新日志到达时,滚动条自动到底。 * 关闭: 用户可自由浏览历史,新日志仅在后台缓存/计数。 |
| 行数限制 | 内存保护机制 | * 配置: 默认 2000 行,可调。 * 清理: 达到上限后,自动移除最旧的文本段落( Paragraph)。 |
| 日志源接入 | 线程安全订阅 | 使用 IObserver<LogEvent> 或 IObservable,内部通过 Dispatcher 安全更新。 |
4. 视觉交互 (UI/UX)
- 布局:
- 顶部工具栏:包含“自动滚动”开关(带图标)、“清空日志”按钮、过滤输入框。
- 中部显示区:
RichTextBox(只读),启用垂直滚动条。 - 底部状态栏:显示当前总日志条数、过滤后的条数。
- 性能优化:
- 由于 WPF
RichTextBox在大量文本下性能较差,建议增加最大行数限制(如默认保留 4000 行,超出自动删除顶部旧日志)。
- 由于 WPF
6. 开发建议
- 颜色解析:如果 Serilog 输出的是纯文本(如
[INF] User logged in),你需要编写正则表达式来匹配[INF]、[ERR]等前缀并着色。 - 线程安全:务必参考
ProgressWindow中UpdateProgress的实现,使用Dispatcher.InvokeAsync或Dispatcher.CheckAccess来确保从后台线程(如 Serilog 的异步写入线程)更新 UI 时不会崩溃。 - 资源占用:考虑到这是一个“基础设施”类库,建议在窗口关闭时(
OnClosed事件)取消对IObservable的订阅,防止内存泄漏。