Я пишу консольное приложение, в котором есть собственный регистратор. Регистратор должен окрашивать все, что отправляется в 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; }
}
}