如何在WinUI3应用中向Windows事件查看器写入日志?
WinUI3 向Windows事件查看器写入日志的解决方案
一、EventSource创建失败的原因
WinUI3基于.NET 5+及以上版本,System.Diagnostics.EventLog创建EventSource需要管理员权限,而WinUI3默认启动流程没有管理员权限;另外如果是MSIX打包的WinUI3应用,系统托管的安装流程不支持自动执行创建EventSource的自定义操作,这就是你遇到创建失败的核心原因。
二、继续使用传统Application日志的实现步骤
1. 提前创建EventSource
创建EventSource必须在管理员权限下完成,有几种方式:
- 非打包应用:保留你原来的WiX安装脚本逻辑,WiX安装时以管理员权限运行,能正常创建EventSource;或者写一个简单的控制台工具,用管理员权限运行执行
EventLog.CreateEventSource("你的源名称", "Application")。 - MSIX打包应用:无法在安装时自动创建,可在应用第一次启动时提示用户以管理员权限运行一次(仅需一次)来创建,或者提前用管理员工具手动创建。
2. WinUI3中的日志写入代码
和.NET Framework的写法基本一致,但要先检查EventSource是否存在,避免权限异常:
using System.Diagnostics; public void WriteToEventLog(string logContent, EventLogEntryType logType) { string eventSourceName = "你的自定义源名称"; // 先检查源是否存在,不存在则跳过(避免无权限报错) if (!EventLog.SourceExists(eventSourceName)) { // 这里可以给用户弹窗提示:需要管理员权限创建日志源,请手动运行创建工具 return; } using (var eventLog = new EventLog("Application")) { eventLog.Source = eventSourceName; eventLog.WriteEntry(logContent, logType); } }
三、更适配WinUI3的ETW日志方案(无需额外工具)
你提到的LoggingSession和LoggingChannel属于ETW(Windows事件跟踪),其实不需要额外下载工具,Windows自带的事件查看器就能查看:
1. 代码实现
using Windows.Foundation.Diagnostics; // 在窗口初始化时创建LoggingChannel private LoggingChannel _appLoggingChannel; public MainWindow() { this.InitializeComponent(); // 自定义提供商名称和唯一GUID(可以自己生成一个) _appLoggingChannel = new LoggingChannel( "MyWinUI3AppLogs", null, new Guid("12345678-1234-1234-1234-1234567890AB")); } // 写入日志的方法 public void WriteEtwLog(string message, LoggingLevel level) { _appLoggingChannel.LogMessage(message, level); }
2. 在事件查看器中查看日志
- 打开事件查看器,点击顶部菜单的「查看」,勾选「显示分析和调试日志」;
- 展开「应用程序和服务日志」→「Microsoft」→「Windows」→「LoggingChannel」(或者你自定义的提供商名称);
- 就能看到你写入的日志,完全用系统自带工具查看,无需额外安装。
总结
- 要沿用传统Application日志,核心是提前在管理员权限下创建EventSource,之后WinUI3的写入逻辑和.NET Framework一致;
- 优先推荐ETW方案,更适配现代Windows应用,权限要求更低,且系统自带工具就能查看日志。
内容的提问来源于stack exchange,提问作者c3rebro
相关产品推荐
相关产品推荐

