2010-11-19 35 views
4

Je souhaite enregistrer les informations de trace dans les fichiers .svclog, mais uniquement pour les demandes ayant échoué. Est-ce possible? Si oui, avec quelle précision?Traçage WCF de SEULEMENT des demandes échouées?

J'ai un service WCF qui est appelé des centaines de fois par minute. En de rares occasions, les clients recevront une erreur 500 qui survient en dehors des limites de mon code qui s'exécute dans WCF (généralement des problèmes de sécurité). J'aimerais savoir exactement pourquoi ces erreurs se produisent et quelle est leur cause.

Je voudrais aussi vraiment utiliser l'outil Trace Viewer pour examiner les fichiers .svclog. Pour autant que je sache, j'ai deux options: 1) instrument de traçage FERB en enregistrant les demandes ayant échoué via les paramètres system.webServer \ tracing. Malheureusement, je n'aime vraiment pas l'interface de l'IE-trace-viewer, et je ne reçois pas assez d'informations de la trace-logs pour comprendre pourquoi une erreur en dehors de mon code s'est produite. 2) activer le suivi global sous la section system.diagnostics \ trace. Cette section produit de superbes journaux de trace avec tout ce que je peux capturer. Cependant, je ne peux pas trouver un moyen de capturer seulement l'information pour les demandes échouées. Cette section capture les informations de trace pour TOUTES les demandes. Mes journaux de suivi se remplissent rapidement!

Mes erreurs 500 sont intermittentes et rares. En fin de compte, je veux toujours avoir mon .svclog suivi ON, mais seulement avoir kick dans quand les demandes échouées se produisent.

S'il vous plaît, si possible?

Merci!

Edit:

Graham, J'ai suivi vos conseils et je ne vois pas les journaux je pense. Voici les sections pertinentes du web.config:

<system.diagnostics> 
    <trace> 
     <listeners> 
      <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics"> 
       <filter type="" /> 
      </add> 
     </listeners> 
    </trace> 

    <sources> 
     <source name="System.ServiceModel" switchValue="Error"> 
      <listeners> 
       <add name="wcfTracing" 
         type="System.Diagnostics.XmlWriterTraceListener" 
         initializeData="Traces1.svclog"/> 
       <add name="log4netTracing" 
         type="AzureWatch.Model.Service.Log4netTraceListener,AzureWatch.Model.Service"/> 
      </listeners> 
     </source> 
     <source name="System.ServiceModel.MessageLogging" switchValue="Error"> 
      <listeners> 
       <add name="wcfTracing" 
         type="System.Diagnostics.XmlWriterTraceListener" 
         initializeData="Traces2.svclog"/> 
       <!--<add name="log4netTracing" 
         type="AzureWatch.Model.Service.Log4netTraceListener,AzureWatch.Model.Service"/>--> 
      </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 

<!-- ... --> 

     <diagnostics wmiProviderEnabled="true"> 

     <messageLogging 
      logEntireMessage="true" 
      logMalformedMessages="true" 
      logMessagesAtServiceLevel="true" 
      logMessagesAtTransportLevel="true" 
      maxSizeOfMessageToLog="1000000" 
      maxMessagesToLog="-1" /> 
    </diagnostics> 

Voici l'erreur client de WCF:

<Exception> 
    <Type>System.Net.Sockets.SocketException</Type> 
    <Message>An existing connection was forcibly closed by the remote host</Message> 
    <StackTrace> 
     <Frame>at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)</Frame> 
    </StackTrace> 
    </Exception> 

Malheureusement, il n'y a rien qui est connecté soit par des oligo-auditeurs. des demandes ayant échoué journal contient ceci:

-GENERAL_READ_ENTITY_END 
    BytesReceived 0 
    ErrorCode 2147943395 
    ErrorCode The I/O operation has been aborted because of either a thread exit or an application request. (0x800703e3) 
    Warning 
-MODULE_SET_RESPONSE_ERROR_STATUS 
    ModuleName ManagedPipelineHandler 
    Notification 128 
    HttpStatus 400 
    HttpReason Bad Request 
    HttpSubStatus 0 
    ErrorCode 0 
    ConfigExceptionInfo 
    Notification EXECUTE_REQUEST_HANDLER 
    ErrorCode The operation completed successfully. (0x0) 
    0 msInformational 

Répondre

6

J'ai essayé de mettre dans la configuration suivante pour mon service WCF, et a frappé le service avec des informations d'identification valides et non valides. Seules les demandes avec des informations d'identification non valides ont provoqué l'apparition de quelque chose dans le fichier de trace du service. Mon service utilise une classe personnalisée UserNamePasswordValidator et celle-ci était présente dans la trace de la pile. Les parties importantes sont switchValue="Error" et propagateActivity="false" dans l'élément <source>. Je ne sais pas si cela est exactement ce que vous voulez, mais au moins semble fermer ...

<system.diagnostics> 
    <sources> 
    <source name="System.ServiceModel" switchValue="Error" 
      propagateActivity="false"> 
     <listeners> 
     <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
      <filter type="" /> 
     </add> 
     <add name="ServiceModelTraceListener"> 
      <filter type="" /> 
     </add> 
     </listeners> 
    </source> 
    </sources> 
    <sharedListeners> 
    <add initializeData="C:\Path-to-log-file\Web_tracelog.svclog" 
     type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
     name="ServiceModelTraceListener" 
     traceOutputOptions="DateTime, Timestamp, Callstack"> 
     <filter type="" /> 
    </add> 
    </sharedListeners> 
    <trace autoflush="true" /> 
</system.diagnostics> 
+0

je suggère d'utiliser le niveau d'alerte au moins initialement jusqu'à ce que vous ayez cloué l'erreur. – softveda

+0

@ Pratik- sonne assez bien - qu'est-ce qui déclencherait un avertissement? Je peux voir que lancer une exception signifierait une erreur ... –

+1

Parfois, des événements d'avertissement peuvent apparaître avant l'erreur réelle et donner des indications supplémentaires sur l'erreur. – softveda

1

Alternativement, il est possible de spécifier EventTypeFilter comme auditeur de filter

<listeners> 
    <add name="console" 
     type="System.Diagnostics.ConsoleTraceListener" > 
     <filter type="System.Diagnostics.EventTypeFilter" 
     initializeData="Error" /> 
    </add> 
    </listeners>