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

Скажем, я работаю над небольшим консольным приложением для пакетной обработки в 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. Это связано с тем, что рабочий метод может вызываться из другого места или даже находиться в другой сборке, и я хочу иметь возможность присоединять к нему разные прослушиватели трассировки. Итак, как мне подключить консоль к трассировке?

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

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
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
74
0
34 484
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете добавить следующее в ваш 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 на тот случай, если вам интересно войти в файл.

Проголосуйте за то, что указали мне на System.Diagnostics.ConsoleTraceListner. Я как-то это упустил. В остальном у меня нет app.config, но вместо этого я могу достаточно легко настроить его в коде.

Joel Coehoorn 13.10.2008 21:24

Это отлично работает для .exe с конфигурацией, но у меня аналогичная ситуация, но с DLL. Я не хочу изменять файл .config вызывающего exe (это nunit-console.exe). Я продолжу поиски, но все равно проголосую за вас, поскольку я определенно кое-что узнал.

Scott Marlowe 14.05.2009 17:50

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

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

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

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

Я знаю, что это старый пост. Но у меня с этим проблема. Не могли бы вы посмотреть мой пост: stackoverflow.com/questions/5568630/…. Я делаю то же самое, но с Debug, и не получаю результатов, т.е. выходной файл пуст. Есть идеи?

TheBoyan 07.04.2011 21:27

Джоэл,

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

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

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

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

Trace.WriteLine("Howdy");

Trace.Listeners.Remove(listener);

Trace.Close();

Другие вопросы по теме