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)
您可以装饰该方法以执行此操作:
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();” 在开始写入控制台之前