Да - заменить Console.Out
. Используйте Console.SetOut
после создания TextWriter
, который не только выводит запрошенные данные на исходную консоль, но также выводит трассировку стека (и метку времени, и запрошенные данные) в файл.
Вот код, адаптированный из ответа Бенджола:
(Примечание: вы захотите адаптировать этот код в зависимости от того, хотите ли вы использовать трассировку стека после каждой записи или после каждой записи. В приведенном ниже коде за каждым символом следует трассировка стека!) *
using System.Diagnostics;
using System.IO;
using System.Text;
public sealed class StackTracingWriter : TextWriter
{
private readonly TextWriter writer;
public StackTracingWriter (string path)
{
writer = new StreamWriter(path) { AutoFlush = true };
}
public override System.Text.Encoding Encoding
{
get { return Encoding.UTF8; }
}
public override void Write(string value)
{
string trace = (new StackTrace(true)).ToString();
writer.Write(value + " - " + trace);
}
public override void Write(char[] buffer, int index, int count)
{
Write(new string(buffer, index, count));
}
public override void Write(char value)
{
// Note that this will create a stack trace for each character!
Write(value.ToString());
}
public override void WriteLine()
{
// This is almost always going to be called in conjunction with
// real text, so don't bother writing a stack trace
writer.WriteLine();
}
protected override void Dispose(bool disposing)
{
writer.Dispose();
}
}
Чтобы использовать это для регистрации как Console.WriteLine
, так и Debug.WriteLine to a file
, совершайте такие звонки как можно раньше в своем коде:
var writer = new StackTracingWriter(@"C:\Temp\ConsoleOut.txt");
Console.SetOut(writer);
Debug.Listeners.Add(new TextWriterTraceListener(writer));
Обратите внимание, что в настоящее время не также не записывает данные в исходную консоль. Для этого вам потребуется секунда TextWriter
(для исходной консоли) в StackTracingWriter
и каждый раз записывать в оба места. Однако отладка будет продолжать записываться на исходную консоль.