2010-07-09 6 views
1

Toute ma logique de service est encapsulée dans la bibliothèque de classes. Lorsque j'instancie la bibliothèque de classes dans une application de ligne de commande, je reçois mes informations de trace. Lorsque j'instancie la classe dans un service Windows, je vois que mon écouteur de trace personnalisé a créé le répertoire des journaux et a démarré un fichier, mais il reste 0 KB.Service Windows .NET et écouteurs de suivi personnalisés

Les deux applications ont cela dans le .config:

<system.diagnostics> 
<switches> 
    <add name="PTraceSwitch" value="Verbose" /> 
</switches> 
<trace autoflush="true"> 
    <listeners> 
    <add name="CustomXmlWriterTraceListener" /> 
    <add name="MyServiceEventListener" /> 
    <remove name="Default" /> 
    </listeners> 
</trace> 
<sharedListeners> 
    <add 
    type="CustomUtilities.CustomXmlWriterTraceListener, CustomUtilities" 
    name="CustomXmlWriterTraceListener" 
    initializeData="Logs\MyService.svclog" 
    RollLogAtMidnight="True" 
    DateFormat="yyyy.MM.dd" 
    MaxFileSizeMB="1" 
    CompressLogsOlderThanTimeSpan="1.00:0:00" 
    DeleteLogsOlderThanTimeSpan="30.00:00:00"/> 

    <add name="MyServiceEventListener" 
     type="System.Diagnostics.EventLogTraceListener" 
     initializeData="MyServiceEventLog"> 
    <filter type="System.Diagnostics.EventTypeFilter" 
     initializeData="Warning" /> 
    </add> 
</sharedListeners> 

+0

Vous manquez un 'Trace.Flush()'? –

+0

Êtes-vous sûr que le fichier 'Logs \ MyService.svclog' est créé par rapport à votre exe? Les services commencent généralement par '\ Windows' ou' \ Windows \ System32' comme leur répertoire de travail. –

+0

@ Rubens Farias, je l'ai mis à Autoflush, et Flush() n'a pas semblé aider – mittio

Répondre

0

Il semble que mon CustomXmlWriterTraceListener se comporte différemment lorsqu'il est exécuté avec un service d'une bibliothèque de classes ou exe.

j'ai ajouté à mon service pour déboguer le principal point d'entrée et de marcher à travers init de mon auditeur:

Debugger.Launch(); 

L'écrivain sous-jacente est nulle quand je lance mon service, il est normalement rempli au cours de la base constructeur. J'ai utilisé. NET Reflector pour voir ce que le XmlWriterTraceListener fait. Il existe une méthode interne EnsureWriter(). Cette méthode devrait créer l'auteur. J'ai cloné la méthode de Microsoft et l'ai ajoutée à mon écouteur, et tout semble aller bien. Mon auditeur est adapté pour un service maintenant.

internal bool EnsureWriter() 
    { 
     bool flag = true; 
     if (Writer == null) 
     { 
      flag = false; 
      if (baseFileName == null) 
      { 
       return flag; 
      } 
      Encoding encodingWithFallback = new UTF8Encoding(false); 
      string fullPath = Path.GetFullPath(baseFileName); 
      string directoryName = Path.GetDirectoryName(fullPath); 
      string fileName = Path.GetFileName(fullPath); 
      for (int i = 0; i < 2; i++) 
      { 
       try 
       { 
        Writer = new StreamWriter(fullPath, true, encodingWithFallback, 0x1000); 
        flag = true; 
        break; 
       } 
       catch (IOException) 
       { 
        fileName = Guid.NewGuid().ToString() + fileName; 
        fullPath = Path.Combine(directoryName, fileName); 
       } 
       catch (UnauthorizedAccessException) 
       { 
        break; 
       } 
       catch (Exception) 
       { 
        break; 
       } 
      } 
      if (!flag) 
      { 
       baseFileName = null; 
      } 
     } 
     return flag; 
    } 
+0

Je ne suis pas sûr si ce que j'écris maintenant est applicable à ce problème, mais je cherchais une solution à un problème similaire (propriété Writer de l'écouteur restant null après l'initialisation) et il est apparu sur moi beaucoup plus tard Internet) que mon service fonctionnait à partir du compte de service local, un compte avec des privilèges restreints, qui bien sûr était interdit d'écrire sur tous les chemins sur mon PC. –

Questions connexes