# 实时日志查看器设计文档
#### 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` 或 `IObservable`,内部通过 `Dispatcher` 安全更新。 |
#### 4. 视觉交互 (UI/UX)
- **布局**:
- **顶部工具栏**:包含“自动滚动”开关(带图标)、“清空日志”按钮、过滤输入框。
- **中部显示区**:`RichTextBox` (只读),启用垂直滚动条。
- **底部状态栏**:显示当前总日志条数、过滤后的条数。
- **性能优化**:
- 由于 WPF `RichTextBox` 在大量文本下性能较差,建议增加**最大行数限制**(如默认保留 4000 行,超出自动删除顶部旧日志)。
#### 6. 开发建议
1. **颜色解析**:如果 Serilog 输出的是纯文本(如 `[INF] User logged in`),你需要编写正则表达式来匹配 `[INF]`、`[ERR]` 等前缀并着色。
2. **线程安全**:务必参考 `ProgressWindow` 中 `UpdateProgress` 的实现,使用 `Dispatcher.InvokeAsync` 或 `Dispatcher.CheckAccess` 来确保从后台线程(如 Serilog 的异步写入线程)更新 UI 时不会崩溃。
3. **资源占用**:考虑到这是一个“基础设施”类库,建议在窗口关闭时(`OnClosed` 事件)取消对 `IObservable` 的订阅,防止内存泄漏。