设置Console.Error的颜色

Tug*_*ain 5 c# console-application textwriter

我正在编写一个包含自定义记录器的控制台应用程序。记录器需要将发送到Console.Error的所有内容涂成红色。现在,我有了第三方引用,这些引用也写入了Console.Out和Console.Error,因此我必须以一种也能说明它们的方式来执行此操作,因为我没有它们的源代码。我已经设置了记录器,以便任何写入控制台的代码都可以通过调用Console.SetOut&Console.SetError方法使用记录器的TextWriter。它有点工作,但我猜想有某种同步问题?在我的ErrorWriter类中,您可以看到我正在设置控制台的前景色,然后调用base.Write(),但结果与预期的不一样。来自Console.Out的应为灰色的文本显示为红色,并且在中间流时突然变为灰色。它一直在相同的字符位置上将颜色从红色变回灰色,但是我假设base.Write()实际上并不会立即吐出到控制台中。有某种滞后时间/缓冲区。我试过调用base.Flush(),但这会使Console.Out的所有文本变成红色,这甚至更糟。我该如何解决这个问题?

public class Logger
{
    private static TextWriter _out;
    private static ErrorWriter _error;

    public Logger()
    {
        Initiliaze();
    }

    public static TextWriter Out
    {
        get
        {
            return _out;
        }
    }

    public static TextWriter Error
    {
        get
        {
            return _error;
        }
    }

    private static void Initiliaze()
    {
        if (_out == null)
            _out = new StreamWriter(Console.OpenStandardOutput());
        if (_error == null)
            _error = new ErrorWriter(Console.OpenStandardError());

        Console.SetOut(Out);
        Console.SetOut(Error);
    }
}

public class ErrorWriter : StreamWriter
{
    // constructors omitted to save space

    public override void Write(string value)
    {
            Console.ForegroundColor = ConsoleColor.Red;
            base.Write(value);
            //base.Flush();
            Console.ResetColor();
    }

    public override Encoding Encoding
    {
        get { return Encoding.Default; }
    }
}
Run Code Online (Sandbox Code Playgroud)

eyo*_*ssi 6

您可以装饰该方法以执行此操作:

public class ConsoleErrorWriterDecorator : TextWriter
{
    private TextWriter m_OriginalConsoleStream;

    public ConsoleErrorWriterDecorator(TextWriter consoleTextWriter)
    {
        m_OriginalConsoleStream = consoleTextWriter;
    }

    public override void WriteLine(string value)
    {
        ConsoleColor originalColor = Console.ForegroundColor;
        Console.ForegroundColor = ConsoleColor.Red;

        m_OriginalConsoleStream.WriteLine(value);

        Console.ForegroundColor = originalColor;
    }

    public override Encoding Encoding
    {
        get { return Encoding.Default; }
    }

    public static void SetToConsole()
    {
        Console.SetError(new ConsoleErrorWriterDecorator(Console.Error));
    }
}
Run Code Online (Sandbox Code Playgroud)

不要忘记运行“ConsoleErrorWriterDecorator.SetToConsole();” 在开始写入控制台之前


Tug*_*ain 2

结果发现这是一个愚蠢的复制/粘贴错误!我两次调用 Console.SetOut()。现在将第二个更改为 Console.SetError() 后即可工作