Перенаправить вывод трассировки на консоль - PullRequest
71 голосов
/ 13 октября 2008

Допустим, я работаю над небольшим консольным приложением для пакетной обработки в 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

Ответы [ 3 ]

149 голосов
/ 13 октября 2008

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

<?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 на тот случай, если вам интересно войти в файл.

50 голосов
/ 23 октября 2009

Joel,

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

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

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

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

Trace.WriteLine("Howdy");

Trace.Listeners.Remove(listener);

Trace.Close();
11 голосов
/ 14 мая 2009

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

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

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

Это, конечно, будет выводить трассировку в файл «output.txt».

...