Files
XplorePlane/XP.Common/Documents/RealTimeLogViewer.Design.md
T

3.5 KiB
Raw Blame History

实时日志查看器设计文档

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: 浅灰色
利用 RichTextBoxTextRange 动态追加。
动态过滤器 关键词黑白名单 * 包含: 仅显示包含关键字的行。
* 排除: 隐藏包含关键字的行。
* 重置: 恢复显示所有。
智能滚动 跟随开关 * 开启: 新日志到达时,滚动条自动到底。
* 关闭: 用户可自由浏览历史,新日志仅在后台缓存/计数。
行数限制 内存保护机制 * 配置: 默认 2000 行,可调。
* 清理: 达到上限后,自动移除最旧的文本段落(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 的订阅,防止内存泄漏。