UWP平台日志替代方案建议及自研日志类合理性咨询
临时实现合理性评估
你的实现思路是成立的,通过后台单线程批量落盘的方式解决了多并发写文件冲突的问题,作为临时过渡方案可以满足基础使用,但存在多个明显缺陷,不建议长期使用:
- 线程安全隐患:你使用非线程安全的
List<string>存储待写日志,前台调用WriteLogSync插入日志、后台遍历并清空集合的操作没有加锁,高并发场景下会出现日志丢失、遍历抛出异常的问题 - IO性能极低:每条日志都重复执行打开文件、初始化流、写入、关闭流的完整流程,完全没有发挥批量写入的优势,当日志量较大时会产生大量不必要的IO开销
- 数据可靠性差:
- 空catch吞掉了所有异常,日志写入失败你完全无法感知
- 应用异常退出时,内存中还未落盘的日志会全部丢失
- 写入时使用
stream.Size + 1作为写入起始位置,会额外写入一个空字节,导致日志文件出现无意义的空字符
- 生命周期管理缺失:后台死循环任务没有绑定取消令牌,应用正常退出时任务可能被强制终止,也可能卡住进程退出流程
UWP推荐日志方案
自研实现优化方向
如果要继续优化当前的临时实现,可以做以下调整:
- 把
List<string>替换为ConcurrentQueue<string>线程安全队列,无需手动加锁即可保证入队、出队操作的线程安全 - 每次写入时先把队列中所有待写日志一次性取出、拼接为完整字符串,仅打开一次文件完成写入,大幅降低IO开销
- 新增
CancellationToken绑定应用生命周期,应用退出时通知后台线程把剩余日志全部落盘后再结束任务 - 不要吞掉所有异常,至少在调试阶段输出异常信息方便排查问题
- 可新增按日期、文件大小分割日志的逻辑,避免单个日志文件过大影响读写性能
成熟开源方案
直接使用成熟的日志库是更稳妥的选择,以下库均原生支持UWP平台:
- Serilog:配置简单灵活,支持直接配置输出到UWP的本地存储目录,内置异步写入、日志分割、结构化日志等能力,生态成熟,是目前UWP项目最常用的日志方案之一
- NLog:功能非常丰富,内置适配UWP的StorageFile写入器,支持自定义日志规则、多输出目标,可满足复杂的日志需求
- Microsoft.Extensions.Logging:微软官方的日志抽象层,可配合Serilog、NLog使用,后续如果要迁移到WinUI3、MAUI等新平台不需要修改日志相关的业务代码
内容的提问来源于stack exchange,提问作者erkan
相关产品推荐
相关产品推荐

