2012-01-09 17 views
23

Actualmente estoy usando TopShelf con una aplicación de consola para crear un servicio de Windows. Cuando ejecuto el código como una aplicación de consola, uso unos pocos Console.WriteLine() para generar resultados. Una vez que el código hace lo que se supone que debe hacer, instalo la aplicación de consola como un servicio de Windows.Console.WriteLine() dentro de un servicio de Windows?

¿Hay algún inconveniente al dejar el código Console.WriteLine() aunque un servicio de Windows no pueda escribir en la consola? ¿Hay algún riesgo de tener código inestable si dejo Console.WriteLine() allí?

+4

Aunque (como señalaron @dtech y @ odie), esto no causa ningún daño, sugiero que eche un vistazo a los marcos de registro tales como log4net o NLog – yas4891

Respuesta

30

The output will simply be discarded.

En un servicio de Windows no hay consola, por lo que la salida de Console.Write * es descartada. Hay una serie de alternativas:

  1. La clase System.Diagnostics.Trace tiene una interfaz similar a la clase Console por lo que podría migrar su código con bastante facilidad a esto.
  2. Se puede configurar para enviar a un archivo. Puede usar la clase System.Diagnostics.EventLog para escribir en el registro de eventos, que luego puede supervisar utilizando Event Viewer.
  3. Puede usar la biblioteca de código abierto log4net de de terceros, que es muy flexible.
7

No, la clase consola se escribe de forma segura a la salida estándar, pero que no acaba de ver la salida.

+1

que se estima que se llene stdout, creo que ahí es donde se preocupa viene de – Patrick

2

Si utiliza la funcionalidad System.Diagnostics.Trace, puede redirigir la salida utilizando los detectores y conmutadores. Si compila con el símbolo TRACE, entonces se incluirá el código. Si no agrega el TRACE, entonces no se compilará en el proyecto.

Si ejecuta sus servicios como consola para la depuración, el Trace se enviará a la consola de manera predeterminada. Empecé a usar Trace en lugar de Debug o Console, ya que puedo, desde el archivo de configuración, generar la información de rastreo en cualquier combinación de archivos, pantalla, base de datos, etc.

+0

Trace las salidas a la consola del depurador, no a la ventana de la consola como 'Console.WriteLine does'. Me parece que hay algo de confusión aquí acerca de qué consola está hablando el OP. – ProfK

+0

Trace se puede configurar para tener múltiples formas de salida, incluida la salida a la consola a través de ConsoleTraceListener. El detector predeterminado para Trace and Debug es DefaultTraceListener, que se envía a la consola de depuración. –

2

La salida siempre fue descartada hasta Windows Server 2008R2. Deje un console.writeline() en un servicio instalado en ese sistema operativo, y obtendrá un error 1067 al iniciar/ejecutar el servicio, dependiendo de la posición de writeline().

+1

¿puede calificar lo que quiere decir con "dependiendo de la posición ..."? Acabo de toparme con este problema y lo solucioné eliminando las instrucciones de la consola, pero estoy realmente desconcertado sobre por qué nunca he visto esto antes, ya que he hecho numerosos servicios de Windows a lo largo de los años. Confirmé el problema en Windows 2008 R2 Svr y en Windows 7 Enterprise. –

Cuestiones relacionadas