Console.WriteLine () внутри службы Windows? - PullRequest
32 голосов
/ 09 января 2012

В настоящее время я использую TopShelf с консольным приложением для создания службы Windows. Когда я запускаю код как консольное приложение, я использую несколько Console.WriteLine () для вывода результатов. Как только код делает то, что должен, я устанавливаю консольное приложение в качестве службы Windows.

Есть ли какие-либо недостатки в оставлении кода Console.WriteLine (), даже если служба Windows не может выполнить запись в консоль? Существуют ли какие-либо риски нестабильного кода, если я оставлю там Console.WriteLine ()?

Ответы [ 4 ]

36 голосов
/ 09 января 2012

Выход будет просто отброшен .

В службе Windows нет консоли, поэтому вывод Console.Write * отбрасываются. Есть ряд альтернатив:

  1. Класс System.Diagnostics.Trace имеет интерфейс, аналогичный Консольный класс, чтобы вы могли легко перенести свой код в него.
  2. Затем его можно настроить для вывода в файл. Вы можете использовать Класс System.Diagnostics.EventLog для записи в журнал событий, который затем можно отслеживать с помощью средства просмотра событий.
  3. Вы можете использовать сторонние библиотека с открытым исходным кодом log4net, которая очень гибкая.
8 голосов
/ 09 января 2012

Нет, консольный класс будет безопасно записывать в STDOUT, но вы просто не увидите вывод.

3 голосов
/ 10 января 2012

Если вы используете функциональность System.Diagnostics.Trace, вы можете перенаправить вывод, используя прослушиватели и переключатели. Если вы скомпилируете с символом TRACE, то код будет включен. Если вы не добавите TRACE, он не будет скомпилирован в проект.

Если вы запускаете свои службы в качестве консоли для отладки, Trace будет выводиться на консоль по умолчанию. Я привык использовать Trace вместо Debug или Console write, поскольку могу из файла конфигурации выводить информацию трассировки в любую комбинацию файлов, экрана, базы данных и т. Д.

2 голосов
/ 21 марта 2014

Вывод всегда отбрасывался до Windows Server 2008R2. Оставьте console.writeline () в службе, установленной в этой ОС, и вы получите ошибку 1067 при запуске / запуске службы, в зависимости от положения writeline ().

...