15 Stimmen

Der beste Weg, Fehler in WCF zu protokollieren

Wie lassen sich Fehler bei der Entwicklung einer WCF-Dienstschicht am besten abfangen und protokollieren, und warum?

Ich kann mir drei Möglichkeiten vorstellen,

1) Manuelle Try/Catches um jede Methode herum.

2) Überlassen Sie die Verantwortung der WCF-Engine.

3) Verwenden Sie eine Bibliothek eines Drittanbieters wie Enterprise Library Policy Injection/Logging.

24voto

fspirit Punkte 2477

Ich würde eine benutzerdefinierte IErrorHandler und verwenden Sie log4net

[AttributeUsage (AttributeTargets.Interface)]
public class ErrorPolicyBehaviorAttribute : Attribute, IContractBehavior, IErrorHandler
    {
    private ILog m_logger;

    #region IErrorHandler

    public void ProvideFault (Exception error, MessageVersion version, ref Message fault)
        {
        return;
        }

    public bool HandleError (Exception error)
        {
        m_logger.Error (error.Message, error);
        return true;
        }

    #endregion

    #region IContractBehavior

    public void ApplyDispatchBehavior (ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
        {
        ...init logger
        ......Add this class to a list of dispatchRuntime.ChannelDispatcher.ErrorHandlers...
        }

    #endregion
    }

Diese Klasse implementiert auch IContractBehavior, so dass Sie sie als Attribut für Ihre Serviceverträge verwenden können.

[ErrorPolicyBehavior]
public interface IYourServiceContract
{ }

log4net ist sehr flexibel, so dass Sie protokollieren können, was Sie brauchen und wann Sie es brauchen.

10voto

Daniel Vassallo Punkte 325264

WCF kann so konfiguriert werden, dass Traces für Prozessmeilensteine über alle Anwendungskomponenten hinweg ausgegeben werden, z. B. für Operationsaufrufe, Codeausnahmen, Warnungen und andere wichtige Verarbeitungsereignisse.

Das Folgende ist eine app.config Beispiel, um die Verfolgung zu aktivieren.

<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Warning" propagateActivity="true" >
        <listeners>
          <add name="xml"/>
        </listeners>
      </source>

      <source name="myUserTraceSource" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="xml"/>
        </listeners>
      </source>
    </sources>

    <sharedListeners>
      <add name="xml" 
           type="System.Diagnostics.XmlWriterTraceListener" 
           initializeData="TraceLog.svclog" />
    </sharedListeners>

  </system.diagnostics>
</configuration>

Mehr über WCF Tracing erfahren Sie unter MSDN: Konfigurieren der Ablaufverfolgung .

Microsoft bietet eine Service Trace Viewer Werkzeug um .svclog-Dateien zu lesen.

Neben der Rückverfolgung können Sie auch folgende Möglichkeiten in Betracht ziehen log4net für die anwendungsinterne Protokollierung.

2voto

t0mm13b Punkte 33393

Es könnte sich für Sie lohnen, Folgendes zu überprüfen log4net . Es gibt eine gute Anleitung hier auf CodeProjekt .

2voto

ram Punkte 11278

Wenn Sie nach einem Protokollierungsrahmen fragen ELMAH ist ebenfalls eine gute Option, die man in Betracht ziehen sollte. Wenn Sie Ihren Code nicht mit try/catch um jede Methode herum verschmutzen möchten, können Sie versuchen, mit AOP-Frameworks was Ihnen die Möglichkeit geben würde, Ausnahmen zu behandeln, indem Sie die Methode mit Attributen markieren

1voto

Joshua Cauble Punkte 1349

Ich würde mich für die Nummer 1 entscheiden. Vor allem wegen des geringeren Aufwands im Vergleich zu Nummer 3 und Nummer 2 sollte einfach ein No-No sein.

Zugegeben, Sie wollen immer noch in etwas wie eine Datei oder einen Eventmanager protokollieren. Aber ich persönlich würde log4net dafür verwenden, da es ein bisschen leichter ist als das ganze entlib Zeug.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X