You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 15:03:14