设置Console.Error的颜色写入

时间:2012-05-10 11:11:29

标签: c# console-application textwriter

我正在编写一个控制台应用程序,其中包含自定义记录器。记录器需要将发送到Console.Error的任何内容用红色着色。我现在有第三方引用,也写入Console.Out和Console.Error所以我必须这样做,因为我没有他们的源代码。我已经设置了我的记录器,以便写入控制台的任何代码都将使用我的记录器的TextWriter来调用Console.SetOut& Console.SetError方法。它有点工作,但我猜有某种同步问题?在我的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; }
    }
}

2 个答案:

答案 0 :(得分:3)

您可以修改方法以执行此操作:

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));
    }
}

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

答案 1 :(得分:2)

原来是一个愚蠢的复制/粘贴错误!我有两次调用Console.SetOut()。现在它的工作在将第二个更改为Console.SetError()

之后