Question

Nous avons un service C # déployé sur un système client distant. L'application écrit une quantité substantielle de "diagnostics". informations à la console (c'est-à-dire Console.WriteLine ()). Le service ne "fait pas ce qu’il devrait". Comment pouvons-nous capturer la sortie de la console du service dans une autre application?

Une version WinForm de l’application peut être chargée sur le site du client. Malheureusement, il fonctionne correctement.

Mise à jour:

Nous sommes en mesure de modifier le service, mais nous préférerions ne pas apporter de modifications majeures pour le moment.

Nous nous connectons également à MSMQ, mais uniquement pour "important". événements. Ce service interagit avec MSMQ pour ses opérations normales. Ou du moins, ça devrait. Le service ne semble pas extraire d'éléments de MSMQ, contrairement à la version WinForm. Donc, écrire les messages qui vont à la console pourrait être problématique.

Était-ce utile?

La solution

Pouvez-vous changer le code de service du tout ? Si c'est le cas, utiliser Console.SetOut pour écrire dans un fichier serait le premier port d'appel le plus évident. Passez ensuite à l’utilisation d’une bibliothèque de journalisation appropriée pour la prochaine version:)

Autres conseils

En général, vous devez éviter d’écrire des informations de diagnostic directement sur la console, le journal des événements, MSMQ ou ailleurs à partir du code de votre application. Appelez plutôt une API de journalisation et utilisez la configuration pour rediriger la sortie où vous le souhaitez.

Par exemple, vous pouvez remplacer tous les Console.WriteLine par Trace.WriteLine (*). Vous pouvez ensuite rediriger la sortie vers la console, vers un fichier ou ailleurs, en modifiant le fichier de configuration de l'application: par exemple, pour générer vers la console, utilisez un ConsoleTraceListener, quelque chose comme:

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

Pendant le débogage, vous aurez votre sortie sur la console. Sur le site client, vous la configurerez pour rediriger la sortie de la trace vers un fichier, le journal des événements ou similaire.

Encore mieux, utilisez un cadre de journalisation tiers (je recommanderais Log4Net), ce qui vous donnera plus d'options que System.Diagnostics.Trace.

(*) Trace.Write / Trace.WriteLine sont identiques à Debug.Write / Debug.WriteLine, sauf que ces derniers ne sont compilés que si le symbole DEBUG est défini. Préférez donc Trace à Debug si vous souhaitez que la sortie soit disponible dans les versions Release.

Vous avez un tas d’options; rediriger la sortie de la console vers un fichier et utiliser une bibliothèque de journalisation appropriée, comme indiqué, en sont deux bonnes. Voici une option intermédiaire: écrivez dans le journal des événements.

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

Recherchez ensuite des entrées dans le journal des événements de l'application (Outils d'administration - > Observateur d'événements), où Source = "MyService".

Je n'utiliserais pas du tout Console.WriteLine à partir d'un service Windows. Vous devriez probablement enregistrer ces erreurs dans un fichier journal.

Pour que plusieurs applications puissent utiliser les journaux, il est également possible de les publier dans une file d'attente MSMQ.

utiliser debug.writeline et utiliser sysinternals debugview?

J'ai trouvé ceci post sur MSDN, qui lie la sortie de la console à une zone de texte enrichi, a fonctionné pour moi très rapidement et facilement.

Il remplace WriteLine et peut être développé pour remplacer d'autres méthodes.

Voici comment j'ai visualisé la sortie de console d'un service exécuté sous Windows 7. Cela pourrait vous aider si vous ne pouvez absolument pas modifier le code source du service pour vous connecter à un fichier.

  1. Exécutez services.msc et modifiez les propriétés du service. Sur le " Se connecter " onglet, cochez la case "Autoriser le service à interagir avec le bureau"

  2. .
  3. Utilisez l’éditeur de registre pour modifier le chemin image de votre service: Accédez à HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ services \ [nom de votre service] et modifiez ImagePath. Ajoutez cmd.exe / c au début de la chaîne ImagePath. Par conséquent, si votre chemin ImagePath d'origine est c: \ myService \ myservice.exe , votre nouveau chemin ImagePath doit être cmd.exe /cc:\myService\myservice.exe.

  4. Démarrez votre service. Vous devriez obtenir une fenêtre contextuelle intitulée "Détection de services interactifs". Sélectionnez "Afficher le message". Votre écran doit changer de contexte et afficher la fenêtre de la console. Lorsque vous avez terminé, cliquez sur le bouton "Retour maintenant". bouton.

  5. Une fois le débogage terminé, redéfinissez ImagePath à sa valeur d'origine. Désélectionnez ensuite la case "Autoriser le service à interagir avec le bureau". case à cocher dans les propriétés du service et redémarrez votre service.

Avertissement: je ne l'ai fait qu'avec un service et cela a fonctionné pour moi. Je ne sais pas si cela fonctionnera pour n’importe quel service ou si cela causera des résultats inattendus, je vous suggère donc de ne le faire que dans un environnement non productif.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top