Вивід перенаправлення трасування на консоль


74

Скажімо, я працюю над невеликим консольним додатком для пакетної обробки у 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

Відповіді:


157

Ви можете додати наступне у файл .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, на випадок, якщо ви зацікавлені у вході у файл.


2
прихильність за вказівку мене на System.Diagnostics.ConsoleTraceListner. Я якось пропустив це. В іншому випадку я не маю app.config, але я можу досить легко встановити це в коді.
Joel Coehoorn

1
Це чудово працює для файлів .exe, які мають конфігурації, але у мене схожа ситуація, але з DLL. Я не хочу змінювати файл .config виклику exe (це nunit-console.exe). Я продовжуватиму шукати, але все одно підняв вам голос, оскільки я, звичайно, чогось навчився.
Скотт Марлоу

55

Джоель,

Ви можете зробити це замість методу налаштування програми:

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

або це, якщо ви хочете керувати додаванням або видаленням слухача протягом життя програми:

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

Trace.WriteLine("Howdy");

Trace.Listeners.Remove(listener);

Trace.Close();

11

Чудове рішення, але у мене ситуація, коли у мене є різні DLL, якими керує один і той же виклик exe, тому я не хочу змінювати файл .config виклику exe. Я хочу, щоб кожна dll обробляла власну зміну виводу трасування.

Досить просто:

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

Це, звичайно, виведе вихід Trace у файл "output.txt".


Я знаю, що це стара публікація. Але у мене з цим проблема. Чи можете ви подивитися на мій пост: stackoverflow.com/questions/5568630/… . Я роблю те саме, але з Debug, і я не отримую результатів, тобто вихідний файл порожній. Будь-які ідеї?
TheBoyan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.