Cum să capturați ieșirea consolei de la un serviciu C #?

Avem un serviciu C# care este implementat într-un sistem de clienți la distanță. Aplicația scrie consolă o cantitate substanțială de informații "de diagnosticare" (adică Console.WriteLine ()). Serviciul nu "face ceea ce ar trebui". Cum putem capta ieșirea consolei din serviciu într-o altă aplicație?

O versiune WinForm aplicația poate fi încărcată la locația clientului. Din păcate, funcționează corect.

Actualizați:

Putem schimba schimbarea serviciului, dar ar prefera să nu facă schimbări majore în acest moment.

De asemenea, suntem logați la MSMQ, dar numai pentru evenimentele "importante". Acest serviciu interacționează cu MSMQ pentru operațiile sale normale. Sau, cel puțin, ar trebui. Serviciul nu pare să tragă elemente din MSMQ atunci când are loc versiunea WinForm. Deci, scrierea mesajelor care merg la consola ar putea fi problematică.

18

7 răspunsuri

Puteți modifica codul de serviciu la toate ? Dacă este așa, folosirea consolei.SetOut pentru a scrie într-un fișier ar fi primul port de apel cel mai evident. Apoi treceți la o bibliotecă de logare corespunzătoare pentru următoarea versiune :)

31
adăugat
Utilizarea Console.SetOut a fost o schimbare minimă suficientă care a dat suficiente informații pentru a determina problema cu serviciul.
adăugat autor Mike Chess, sursa

În general, ar trebui să evitați scrierea informațiilor de diagnostic direct în Consola, Jurnalul de evenimente, MSMQ sau în altă parte din codul aplicației. În schimb, apelați un API de înregistrare și utilizați configurația pentru a redirecționa ieșirea oriunde doriți.

De exemplu, ați putea înlocui toate Console.WriteLine de Trace.WriteLine (*). Apoi, puteți redirecționa ieșirea la consola, un fișier sau în altă parte modificând fișierul de configurare a aplicației: de exemplu, pentru a ieși în consola, utilizați un ConsoleTraceListener, ceva de genul:


  
    <trace autoflush="false" indentsize="4">
      
        
      
    
  
 

În timpul depanării, veți obține ieșirea pe consola - pe site-ul clientului pe care l-ați configura pentru a redirecționa ieșirea de urmărire într-un fișier, în jurnalul de evenimente sau similar.

Chiar mai bine, folosiți un cadru de logare al părților terțe (aș recomanda Log4Net), care vă va oferi mai multe opțiuni decât System.Diagnostics.Trace.

(*) Trace.Write/Trace.WriteLine sunt aceleași ca Debug.Write/Debug.WriteLine, cu excepția faptului că acestea sunt compilate numai dacă este definit simbolul DEBUG. Deci, preferați Trace la Debug dacă doriți ca output-ul să fie disponibil în Versiunile build.

12
adăugat

Ai o grămadă de opțiuni; redirecționarea ieșirii consolei într-un fișier și folosirea unei biblioteci corespunzătoare de înregistrare, așa cum am menționat, sunt două bune. Iată o opțiune de mijloc: scrieți în jurnalul de evenimente.

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);

Then look for entries in the Application event log (Administrative Tools -> Event Viewer) where Source = "MyService".

5
adăugat

utilizați debug.writeline și folosiți sysinternals debugview?

3
adăugat
sau log4net data viitoare și configurați destinația.
adăugat autor kenny, sursa

Nu aș folosi Console.WriteLine deloc de la un serviciu de ferestre. Probabil că trebuie să înregistrați aceste erori într-un fișier jurnal.

Un alt mod de a face acest lucru, astfel încât mai multe aplicații pot consuma jurnalele este postarea mesajelor de jurnal într-o coadă MSMQ.

3
adăugat

Am găsit această postare pe MSDN care leagă ieșirea din Consola într-o casetă de text bogată, a lucrat pentru mine foarte rapid și ușor.

Acesta suprascrie WriteLine și poate fi extins pentru a suprascrie alte metode.

1
adăugat

Iată cum am văzut ieșirea din consola unui serviciu care rulează sub Windows 7. Acest lucru poate ajuta dacă nu puteți modifica codul sursă al serviciului pentru a vă conecta la un fișier.

  1. Rulați services.msc și editați proprietățile serviciului. În fila "Log On", bifați opțiunea "Permiteți serviciului să interacționeze cu desktopul"

  2. Utilizați editorul de registri pentru a modifica ImagePath al serviciului dvs.: Mergeți la HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ services \ [numele serviciului] și editați ImagePath. Adăugați cmd.exe/c la începutul șirului ImagePath. Deci, dacă originalul ImagePath este c: \ myService \ myservice.exe , noul dvs. ImagePath ar trebui să fie cmd.exe /cc:\myService\myservice.exe.

  3. Porniți serviciul. Ar trebui să obțineți o fereastră popup intitulată "Detectarea serviciilor interactive". Selectați "Vizualizare mesaj". Ecranul dvs. ar trebui să schimbe contextele și să afișeze fereastra consolei. Când ați terminat, faceți clic pe butonul "Înapoi acum".

  4. După terminarea depanării, modificați ImagePath înapoi la valoarea inițială. Apoi, debifați caseta de selectare "Permiteți serviciului de a interacționa cu desktopul" din proprietățile serviciului și reporniți serviciul.

Atenție: Am făcut doar acest lucru cu un singur serviciu și a lucrat pentru mine. Nu știu dacă va funcționa pentru orice serviciu sau dacă va produce rezultate neașteptate, așa că vă sugerez să faceți acest lucru doar într-un mediu non-producție.

1
adăugat