.NET MAUI应用关闭后驻留后台致MetroLog日志文件被锁定
问题:.NET 8 MAUI + MetroLog.Maui 日志文件被占用/应用关闭后进程驻留
更新: 已找到潜在根本原因:Windows平台上的MAUI应用关闭时(无论点击窗口关闭按钮还是调用Application.Current.Quit()),进程并未终止而是作为后台进程留存。强制结束该进程后,日志文件的锁定状态解除,重新打开应用即可正常运行。这也是全新安装首次运行正常的原因——此时无后台进程锁定文件。求问:为何MAUI应用关闭后无法完全终止而驻留后台?
我在使用MetroLog.Maui包(v2.1.0)的.NET 8 MAUI应用中遇到问题:通过MSIX在其他机器安装应用后,使用MetroLog的StreamingFileLogger保存压缩日志时,出现“MetroLog日志文件正被其他进程占用”的错误,且无法在指定路径找到该文件。最初该错误会导致应用崩溃,我已添加try/catch将错误信息通过弹窗展示。
关键现象
- 应用通过MSIX安装且未在Visual Studio中运行(Release或Debug配置)时,首次获取压缩日志正常,但后续尝试均因文件被锁定而抛出异常。
- 使用
InMemoryLogger则运行完全正常。
已做排查
- 已添加try/catch/finally语句确保内存流和归档文件在使用后被释放。
- 发现有类似问题但无有效回复。
相关代码
触发错误的代码(调用GetCompressedLogs()时)
private async Task SaveWindowsLogs() { // 此处出错! MemoryStream memoryStream = await _logController.GetCompressedLogs() ?? new MemoryStream(); if (null == memoryStream || memoryStream.Length == 0) { _ = Toast.Make("No compressed logs are available").Show(); return; } using (memoryStream) { FileSaverResult fileSaverReult = await FileSaver.Default.SaveAsync("Logs.zip", memoryStream); string toastMsg; if (fileSaverReult.IsSuccessful) { toastMsg = $"Logs Succesfully saved at {fileSaverReult.FilePath}"; } else { toastMsg = $"Log Share Failed \n {fileSaverReult.Exception.Message}"; } _ = Toast.Make(toastMsg).Show(); } }
正常运行的代码(使用InMemoryLogger)
// 此处运行正常! private async Task<List<string>> GetSessionLogs() { return await _logController.GetLogList() ?? new List<string>(); }
MauiProgram.cs中的日志配置
builder.Logging #if DEBUG .AddTraceLogger(options => { options.MinLevel = LogLevel.Trace; options.MaxLevel = LogLevel.Critical; }) // 输出到调试窗口 .AddDebug().SetMinimumLevel(LogLevel.Trace) #endif .AddStreamingFileLogger( options => { options.RetainDays = 1; options.MinLevel = LogLevel.Debug; options.MaxLevel = LogLevel.Critical; }) .AddInMemoryLogger(options => { options.MaxLines = MauiConstants.MAX_LOGS; options.MinLevel = LogLevel.Debug; options.MaxLevel = LogLevel.Critical; });
想请教各位是否有解决该问题的思路。
内容的提问来源于stack exchange,提问作者TechWes977
相关产品推荐
相关产品推荐

