# 实时日志查看器设计文档 #### 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` 的订阅,防止内存泄漏。