我正在编写一个控制台应用程序,其中包含自定义记录器。记录器需要将发送到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; }
}
}
答案 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()
之后