Передать сообщения console.writeLine () в текстовый файл - PullRequest
1 голос
/ 29 сентября 2011

Интересно, как лучше всего реализовать регистратор, который по сути съедает все Console.WriteLine() сообщения и выплевывает текстовый файл всех этих сообщений.

Я знаю, что мог бы использовать StringBuilder и заполнитьэто со всеми сообщениями, делая .AppendLine везде, где Console.WriteLine происходит ... но я ищу что-то более волшебное, чем это.Некоторый способ, при котором мне не нужно писать столько строк кода, сколько Console.WriteLine s в существующем коде.

И в случае, если вы пропустили теги, это для консольного приложения C # 4.0.

Ответы [ 2 ]

2 голосов
/ 29 сентября 2011

Вместо использования Console.Write в вашем коде используйте Trace.Write. Затем в файле конфигурации добавьте ConsoleTraceListener к слушателям трассировки.

Этот метод позволит вам выполнять трассировку, и инфраструктура трассировки выведет его как на консоль, так и на любой прослушиватель трассировки, который вы настроили (возможно, TextWriterTraceListener в вашем случае).

Некоторая сторонняя библиотека (log4not мне не приходит в голову) также позволяет инкапсулировать все механизмы ведения журналов.

0 голосов
/ 29 сентября 2011

Я предполагаю, что вам нужен поток, который записывает в стандартный формат и в файл. То есть вы хотите, чтобы все отображалось на консоли, но вы также хотите, чтобы оно было записано в файл. (Если вы просто хотите перенаправить вывод в файл, вы можете сделать это из командной строки.)

Вам нужно создать свой собственный класс TextWriter и получить реальный вывод. Вы звоните Console.SetOut, чтобы заставить консоль писать на TextWriter.

class ConsoleLogger: TextWriter
{
    private TextWriter ConsoleOutputStream;
    private StreamWriter LogOutputStream;
    public ConsoleLogger(string logFilename)
    {
        ConsoleOutputStream = Console.Out;
        // Initialize your log file
        LogOutputStream = new StreamWriter(logFilename);
    }

    public void Write(string s)
    {
        ConsoleOutputStream.Write(s);
        LogOutputStream.Write(s);
    }

    // Other Write functions format their arguments and call Write(string).
}

И в программе, которая использует это:

private ConsoleLogger MyLogger;
const string LogFilename = "ConsoleLog.txt";
void Main()
{
    MyLogger = new ConsoleLogger(LogFilename);
    Console.SetOut(MyLogger);
}

Вам не нужно переопределять все методы TextWriter. Как говорится в документации , «производный класс должен минимально реализовывать метод TextWriter.Write(Char), чтобы создать полезный экземпляр TextWriter».

Я сделал что-то похожее на это, и это работает довольно хорошо.

...