Подтвердить что ты не робот

Перенаправить вывод трассировки в консоль

Скажем, я работаю над небольшим консольным приложением пакетной обработки в VB.Net. Я хочу, чтобы иметь возможность структурировать приложение следующим образом:

Sub WorkerMethod()
   'Do some work
   Trace.WriteLine("Work progress")

   'Do more work
   Trace.WriteLine("Another progress update")

   '...
End Sub


Sub Main()

   'Do any setup, like confirm the user wants to continue or whatever

   WorkerMethod()     

End Sub

Обратите внимание, что я использую Trace вместо Console для моего вывода. Это связано с тем, что рабочий метод можно вызвать из другого места или даже жить в другой сборке, и я хочу иметь возможность подключать к нему разные прослушиватели трассировки. Итак, как я могу подключить консоль к трассе?

Я уже могу это сделать, указав простой класс (показано ниже) и добавив экземпляр в коллекцию слушателей Trace, но мне интересно, есть ли более приемлемый или встроенный способ для этого:

Public Class ConsoleTrace
    Inherits Diagnostics.TraceListener

    Public Overloads Overrides Sub Write(ByVal message As String)
        Console.Write(message)
    End Sub

    Public Overloads Overrides Sub WriteLine(ByVal message As String)
        Console.WriteLine(message)
    End Sub
End Class
4b9b3361

Ответ 1

Вы можете добавить следующее в файл exe.config.

<?xml version="1.0"?>
<configuration>
    <system.diagnostics>
        <trace autoflush="true">
            <listeners>
                <add name="logListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="cat.log" />
                <add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener"/>
            </listeners>
        </trace>
    </system.diagnostics>
</configuration>

Я также включил TextWriter, если вы заинтересованы в регистрации в файле.

Ответ 2

Joel,

Вы можете сделать это вместо метода конфигурации приложения:

Trace.Listeners.Add(new ConsoleTraceListener());

или это, если вы хотите управлять добавлением или удалением слушателя в течение всего срока действия приложения:

ConsoleTraceListener listener = new ConsoleTraceListener();
Trace.Listeners.Add(listener);

Trace.WriteLine("Howdy");

Trace.Listeners.Remove(listener);

Trace.Close();

Ответ 3

Отличное решение, но у меня есть ситуация, когда у меня есть другая dll, выполняемая тем же вызовом exe, поэтому я не хочу изменять вызывающий exe файл .config. Я хочу, чтобы каждая dll обрабатывала собственное изменение вывода трассировки.

достаточно просто:

Stream outResultsFile = File.Create ("output.txt");
var textListener = new TextWriterTraceListener (outResultsFile);
Trace.Listeners.Add (textListener);

Это, конечно, выводит вывод Trace в файл "output.txt".