如何让 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 访问权限?