Domanda

Abbiamo un servizio C # che viene distribuito a un sistema di cliente remoto. L'applicazione scrive una notevole quantità di "diagnostica" informazioni sulla console (ad esempio Console.WriteLine ()). Il servizio non sta "facendo ciò che dovrebbe". Come possiamo catturare l'output della console dal servizio in un'altra applicazione?

Una versione di WinForm che l'applicazione può essere caricata nella posizione del cliente. Sfortunatamente, funziona correttamente.

Aggiornamento:

Siamo in grado di cambiare la modifica del servizio, ma preferiamo non apportare modifiche importanti in questo momento.

Stiamo anche effettuando l'accesso a MSMQ, ma solo per " important " eventi. Questo servizio interagisce con MSMQ per le sue normali operazioni. O almeno, dovrebbe. Il servizio non sembra estrarre elementi da MSMQ quando lo fa la versione di WinForm. Quindi, scrivere i messaggi che stanno andando sulla console potrebbe essere problematico.

È stato utile?

Soluzione

Sei in grado di cambiare il codice di servizio affatto ? In tal caso, l'utilizzo di Console.SetOut per scrivere su un file sarebbe invece la prima porta di chiamata più ovvia. Quindi passa a utilizzare una libreria di registrazione appropriata per la prossima versione :)

Altri suggerimenti

In generale, dovresti evitare di scrivere informazioni diagnostiche direttamente su Console, Registro eventi, MSMQ o altrove dal codice dell'applicazione. Chiama invece un'API di registrazione e usa la configurazione per reindirizzare l'output dove vuoi.

Ad esempio, è possibile sostituire tutte le Console.WriteLine di Trace.WriteLine (*). Quindi puoi reindirizzare l'output sulla console, un file o altrove modificando il file di configurazione dell'applicazione: ad esempio per eseguire l'output sulla console, utilizzare ConsoleTraceListener, in qualche modo:

<configuration>
  <system.diagnostics>
    <trace autoflush="false" indentsize="4">
      <listeners>
        <add name="configConsoleListener"
             type="System.Diagnostics.ConsoleTraceListener" />
      </listeners>
    </trace>
  </system.diagnostics>
 </configuration>

Durante il debug, otterrai l'output sulla console: sul sito del cliente lo configureresti per reindirizzare l'output di traccia su un file, sul registro eventi o simile.

Ancora meglio, usa un framework di registrazione di terze parti (raccomanderei Log4Net) che ti darà più opzioni di System.Diagnostics.Trace.

(*) Trace.Write / Trace.WriteLine sono uguali a Debug.Write / Debug.WriteLine, tranne per il fatto che questi ultimi sono compilati solo se è stato definito il simbolo DEBUG. Quindi preferisci Traccia su Debug se desideri che l'output sia disponibile nelle build di rilascio.

Hai un sacco di opzioni; il reindirizzamento dell'output della console su un file e l'utilizzo di una libreria di registrazione appropriata come indicato sono due buoni. Ecco un'opzione centrale: scrivere nel registro eventi.

EventLog log;
string logsource = "MyService";

// execute once per invocation
if (!System.Diagnostics.EventLog.SourceExists(logsource))
{
    System.Diagnostics.EventLog.CreateEventSource(
        logsource, "Application");
}
log = new EventLog();
log.Source = logsource;
log.Log = "Application";

// replace console logging with this
log.WriteEntry(message, EventLogEntryType.Information);

Quindi cerca le voci nel registro eventi dell'applicazione (Strumenti di amministrazione - > Visualizzatore eventi) dove Source = " MyService " ;.

Non userei affatto Console.WriteLine da un servizio di Windows. Probabilmente dovresti registrare questi errori in un file di registro.

Un altro modo per farlo in modo che più applicazioni possano utilizzare i registri è pubblicare i messaggi di registro in una coda MSMQ.

usa debug.writeline e usa sysinternals debugview?

Ho trovato post su MSDN che collega l'output della console a una casella di testo avanzata, ha funzionato per me molto rapidamente e facilmente.

Sostituisce WriteLine e potrebbe essere espanso per ignorare altri metodi.

Ecco come ho visualizzato l'output della console di un servizio in esecuzione su Windows 7. Ciò potrebbe essere utile se non si è assolutamente in grado di modificare il codice sorgente del servizio per accedere a un file.

  1. Esegui services.msc e modifica le proprietà del servizio. In " Accedi " , seleziona la scheda " Consenti al servizio di interagire con il desktop "

  2. Usa l'editor del registro per modificare ImagePath del tuo servizio: vai su HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ services \ [il nome del tuo servizio] e modifica ImagePath. Aggiungi cmd.exe / c all'inizio della stringa ImagePath. Quindi, se ImagePath originale è c: \ myService \ myservice.exe il tuo nuovo ImagePath dovrebbe essere cmd.exe /cc:\myService\myservice.exe .

  3. Avvia il tuo servizio. Dovresti visualizzare una finestra popup denominata " Rilevamento di servizi interattivi " ;. Seleziona " Visualizza il messaggio " ;. Lo schermo dovrebbe cambiare contesto e visualizzare la finestra della console. Al termine, fai clic su " Ritorna ora " pulsante.

  4. Al termine del debug, modificare ImagePath al suo valore originale. Quindi deseleziona " Consenti al servizio di interagire con il desktop " casella di controllo nelle proprietà del servizio e riavviare il servizio.

Avvertenza: l'ho fatto solo con un servizio e ha funzionato per me. Non so se funzionerà per qualsiasi servizio o se causerà risultati imprevisti, quindi ti consiglio vivamente di farlo solo in un ambiente non di produzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top