51 lines
3.5 KiB
Markdown
51 lines
3.5 KiB
Markdown
# 实时日志查看器设计文档
|
||
|
||
#### 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 标记<br>解析日志事件中的 Level 或 Message Template。 | * Error/Fatal: 红色/深红色<br>* Warning: 橙色/黄色<br>* Info: 默认色<br>* Debug: 浅灰色<br>利用 `RichTextBox` 的 `TextRange` 动态追加。 |
|
||
| 动态过滤器 | 关键词黑白名单 | * 包含: 仅显示包含关键字的行。<br>* 排除: 隐藏包含关键字的行。<br>* 重置: 恢复显示所有。 |
|
||
| 智能滚动 | 跟随开关 | * 开启: 新日志到达时,滚动条自动到底。<br>* 关闭: 用户可自由浏览历史,新日志仅在后台缓存/计数。 |
|
||
| 行数限制 | 内存保护机制 | * 配置: 默认 2000 行,可调。<br>* 清理: 达到上限后,自动移除最旧的文本段落(`Paragraph`)。 |
|
||
| 日志源接入 | 线程安全订阅 | 使用 `IObserver<LogEvent>` 或 `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` 的订阅,防止内存泄漏。
|