如何让 System.Diagnostics 在 Ubuntu Linux 上的 Blazor 应用程序中工作?

Posted

技术标签:

【中文标题】如何让 System.Diagnostics 在 Ubuntu Linux 上的 Blazor 应用程序中工作?【英文标题】:How to get System.Diagnostics to work in a Blazor application on Ubuntu Linux? 【发布时间】:2021-06-18 12:36:53 【问题描述】:

我正在尝试在 Ubuntu Linux 上的 Blazor 应用程序中使用 Debug.WriteLine。当我使用dotnet run 运行程序或使用F5 来使用调试器时,程序运行正常,但调试语句不起作用。我使用的编辑器是 Visual Studio Code。 我见过类似的问题,但都没有解决 Ubuntu 或其他 Linux 发行版上的这个问题。

这是我的代码中的 DamageCalculator 类的构造函数和方法,它们调用 Debug.WriteLine 方法:

    using System;
    using System.Diagnostics;

    .
    .

    public DamageCalculator()
    
      Debug.WriteLine("Created an instance of DamageCalculator");
    
    public void CalculateDamage()
    
      Roll = Roll3Dice();
      Debug.WriteLine("Rolled the dice with roll: " + Roll);
      Damage = (int)(Roll * Multiplier)
    

csproj 文件:

<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="5.0.4" />
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="5.0.4" PrivateAssets="all" />
    <PackageReference Include="System.Net.Http.Json" Version="5.0.0" />
  </ItemGroup>
</Project>

launchSettings.json


  "profiles": 
    "damage_calculator": 
      "commandName": "Project",
      "dotnetRunMessages": "true",
      "launchBrowser": true,
      "inspectUri": "wsProtocol://url.hostname:url.port/_framework/debug/ws-proxy?browser=browserInspectUri",
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": 
        "ASPNETCORE_ENVIRONMENT": "Development"
      
    
  

vscode 的 launch.json:


  "version": "0.2.0",
  "configurations": [
    
      "type": "blazorwasm",
      "name": "Launch and Debug Blazor WebAssembly Application",
      "request": "launch"
    
  ]

有谁知道它为什么不起作用以及如何使它起作用?

【问题讨论】:

您在哪里/如何查找输出?这不是 Console.WriteLine()。 我希望在实际执行程序的终端中看到输出。 不,在 Windows 中您需要运行 WinDbg 或 Visual Studio。也许 VS Code 有一个用于捕获调试输出的“输出窗口”。但请尝试 Console.WriteLine() 。当然,仅适用于服务器端代码 (API)。 在 WebAssembly 中:查看 Browser JS 控制台。 Console.WriteLine() 确实在浏览器中工作。 Debug.WriteLine 不起作用可能是因为它正在尝试写入 stderr 并且无法在浏览器中执行此操作。 【参考方案1】:

如果你想使用Debug.WriteLine 功能,我建议使用内置记录器。

它可以跨平台工作,您可以通过环境变量进行配置:

要记录的严重性级别(跟踪、调试、信息、警告、错误、严重) 登录媒体(磁盘、控制台) 特定平台功能,例如使用 systemd (linux)、eventlog (windows) 等。 提供一站式服务

它还记录到 Blazor 中的浏览器控制台 - PWA:

(firefox控制台图像,用paint编辑)

在大多数 .net 核心项目中默认启用它。

使用 API 控制器

public class CommandController : ControllerBase

    private readonly ILogger<CommandController> _logger;
    public CommandController(ILogger<CommandController> logger)
    
        _logger = logger;
    

    [HttpGet]
    public IActionResult Test()
    
        _logger.LogDebug("Hi there!");
    

WPA Blazor:

@inject ILogger<Index> logger
<!--  html stuff -->
@code 
    protected async override Task OnParametersSetAsync()
    
        logger.LogDebug("hellow!");
    

在 blazor 中,它并不总是开箱即用。有关详细信息,请参阅此页面: https://docs.microsoft.com/en-us/aspnet/core/blazor/fundamentals/logging?view=aspnetcore-5.0&pivots=webassembly

配置

至于 blazor,您可能需要在您的 program.cs 中添加这一行:

builder.Logging.SetMinimumLevel(LogLevel.Debug);

通常,它伴随着 application.json 中的默认日志设置:

"Logging": 
    "LogLevel": 
      "Default": "Debug",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    
  

【讨论】:

感谢您的详尽回答,在这种情况下,我将使用此内置记录器。你有更多关于为什么 Debug 类在 Linux 上不起作用的信息吗? 嗨,不,不是。就此而言,它实际上没有让我感到惊讶。 Console.WriteLine 之类的东西都是开箱即用的。我不明白为什么Debug 不应该工作。我也没有发现任何关于它在 linux 上不可用的信息 - 所以,它可能只是工作,也许你的情况真的很具体.. 这与 Debug.WriteLine 试图在浏览器中写入标准错误有关。 嗯...这仍然很奇怪,因为我相信 stderr 在大多数操作系统中都很常见。

以上是关于如何让 System.Diagnostics 在 Ubuntu Linux 上的 Blazor 应用程序中工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 System.Diagnostics.Trace 和 System.Diagnostics.Debug 消息记录到 NLog 文件?

如何获得 System.Diagnostics.Process 的输出?

如何创建 System.Diagnostics.Process 数组

您如何限制 C# .NET 中的 System.Diagnostics.Process HANDLE 访问权限?

.NET 6 全新指标 System.Diagnostics.Metrics 介绍

.NET 6 全新指标 System.Diagnostics.Metrics 介绍