簡體   English   中英

Console.SetOut 不適用於 ConsoleLogger

[英]Console.SetOut does not work with ConsoleLogger

在我的 asp.net 應用程序中,我在調試時使用 ConsoleLogger。

services.AddLogging(builder => builder.AddConsole());

在集成測試中,我試圖像這樣獲得控制台 output

var strWriter = new StringWriter();
Console.SetOut(strWriter);

// some code that has a lot of logging

var consoleOutput = strWriter.ToString();

並且 consoleOutput 是一個空字符串。

ConsoleLogger 有這個問題嗎? 如何獲取控制台 output?

不知道你為什么要這樣做甚至更多 - 我會說你不應該這樣做,至少這樣,但如果你仍然想要 - 你將需要Console.SetOut在寫入第一條消息以記錄之前,即在 ASP.NET 的情況下核心應該是這樣的:

public static StringWriter GlobalStringWriter = new StringWriter(); // use this "singleton"
    
public static void Main(string[] args)
{
    Console.SetOut(GlobalStringWriter);
    CreateHostBuilder(args).Build().Run();
}

請注意,它將捕獲所有並發請求(無論如何它都應該這樣做)。

如果您查看ConsoleLoggerProvider的源代碼(實際上是使用AddConsole調用設置的),您會看到在內部使用AnsiLogConsole / AnsiParsingLogConsole兩者都在內部捕獲System.Console.Error / System.Console.Out的當前值他們的構造函數:

public AnsiParsingLogConsole(bool stdErr = false)
{
    _textWriter = stdErr ? System.Console.Error : System.Console.Out;
    _parser = new AnsiParser(WriteToConsole);
}

public AnsiLogConsole(bool stdErr = false)
{
    _textWriter = stdErr ? System.Console.Error : System.Console.Out;
}

因此,在此捕獲發生后設置字符串寫入器實際上並不會改變寫入日志的位置。

我會說這不是很好的方法,可能你最好考慮實現某種你自己的記錄器提供程序,它可以讓你處理這個用例,或者使用現有的一個並將其設置為調試模式以寫入文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM