1. 项目背景与痛点分析
作为一名长期奋战在.NET开发一线的程序员,我深知调试过程中控制台日志刷屏的痛苦。每次运行包含大量业务逻辑的应用程序时,控制台窗口就像失控的打印机,疯狂输出各种调试信息、异常堆栈和性能数据。这种场景下,真正需要关注的关键信息往往被淹没在海量日志中。
传统解决方案通常有两种路径:要么使用成熟的日志系统(如NLog、Serilog)配合可视化工具,要么在代码中不断添加条件判断来过滤日志输出。前者虽然功能强大但配置复杂,后者则会导致代码臃肿且难以维护。更令人抓狂的是,当需要临时查看某个特定模块的日志时,不得不反复修改日志级别配置或重新编译项目。
这个项目的初衷,就是打造一个专为.NET开发者设计的轻量级解决方案——它应该像控制台一样简单易用,又能提供可视化过滤能力;既不需要复杂的配置,又能无缝集成到现有项目中。经过多次迭代,最终实现的日志面板只有不到200KB大小,却能显著提升开发调试效率。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心设计思路
2.1 技术选型考量
选择WPF作为实现框架主要基于三个考量:首先,WPF内置的强大数据绑定和模板系统非常适合动态日志展示;其次,它与.NET生态天然兼容,无需额外依赖;最后,WPF的UI线程与后台线程的Dispatcher机制能很好地处理高频率日志更新。
日志收集方面采用了观察者模式。通过创建一个静态的LogBroker类作为中介,任何地方的代码都可以通过简单的LogBroker.Publish(message)调用发布日志,而日志面板则作为订阅者接收这些消息。这种松耦合设计使得日志源和消费者完全解耦。
csharp复制public static class LogBroker
{
private static readonly List<ILogSubscriber> _subscribers = new();
public static void Subscribe(ILogSubscriber subscriber) {
lock(_subscribers) {
_subscribers.Add(subscriber);
}
}
public static void Publish(LogMessage message) {
lock(_subscribers) {
foreach(var sub in _subscribers) {
sub.OnMessageReceived(message);
}
}
}
}
2.2 性能优化策略
面对可能的高频日志输出(比如在循环中记录变量变化),直接更新UI会导致严重卡顿。解决方案是采用双重缓冲设计:
- 后台线程将收到的日志先存入ConcurrentQueue
- 专门的DispatcherTimer以固定间隔(默认50ms)批量处理队列
- 每次批量处理最多100条日志,避免单次UI更新耗时过长
csharp复制// 日志收集器部分实现
private readonly ConcurrentQueue<LogMessage> _buffer = new();
private readonly DispatcherTimer _batchTimer;
private void InitializeTimer()
{
_batchTimer = new DispatcherTimer(
TimeSpan.Fro
