WCF-Protokollierung / Ablaufverfolgung und Aktivitäts-ID-Propagierung mit log4net oder NLog

Ich habe gesehen, viele andere Fragen, auf die Protokollierung. Best-practices. Was Protokollierung-Plattform am besten ist. Etc. Hier sind einige links von hier auf, SO dass mit sehr guten Gesprächen auf das Thema:

logging best practices

log4net vs TraceSource

beste logging-Lösung .NET 3.5 Projekt

.NET 3.5 Anmeldung

BEGINNEN EDIT:

Zusammengenommen, dieser lange post, ich denke, dass die Hauptsache, die ich versuche, herauszufinden, ist, wie eng gekoppelt WCF-logging/tracing und die Aktivitäts-id-Verteilung System.Diagnostik und TraceSources. Kann man "gute" WCF logging/tracing und die Aktivitäts-id-Propagierung über eine Dritte Partei-logging-Plattform, wie log4net oder NLog. Wenn Sie dies tun, wie Sie es tun?

Siehe Ende von diesem post für ein paar Fragen über ServiceTraceViewer,

ENDE BEARBEITEN.

Dem Thema meine Frage wird nicht diskutiert, die detailliert in einem dieser Beiträge. Ich bin daran interessiert, was Menschen tun, in Bezug auf die Protokollierung und WCF. Wenn Sie arbeiten an einem Projekt mit WCF services und Sie haben die Protokollierung in Ihr Projekt, Sie machen keine besonderen Anstrengungen zur Nutzung der WCF-spezifische logging-Funktionen. Insbesondere versuchen Sie zu integrieren Dinge wie Aktivitäts-Tracing, aktivitätsausbreitung, und End-to-End-Ablaufverfolgung? Wie beschrieben ist in diese Artikel aus der MSDN-Website. Hier ist ein weiterer Artikel aus dem MSDN auf Vermehrungs-Aktivitäten.

Den Artikel sehr gut erläutert, wie das zu tun Aktivitäts-tracing, aktivitätsausbreitung, und end-to-end-Ablaufverfolgung mithilfe von System.Diagnostik TraceSources. Es zeigt, wie die Konfiguration von WCF zu "aktivieren" Sie diese Optionen über die app.config/web.config-Datei. WCF verwendet TraceSources intern zu melden, die Ergebnisse der Kommunikation.

Ist hier einige Beispiel-Codezeilen (aus der zweiten oben verlinkten MSDN-Artikel) , zeigt mehr oder weniger, wie Sie zu erreichen aktivitätsausbreitung über System.Diagnostik und TraceSources:

TraceSource ts = new TraceSource("myUserTraceSource");
Guid oldID = Trace.CorrelationManager.ActivityId;
Guid traceID = Guid.NewGuid();
ts.TraceTransfer(0, "transfer", traceID);
Trace.CorrelationManager.ActivityId = traceID; //Trace is static
ts.TraceEvent(TraceEventType.Start, 0, "Add request");

double value1 = 100.00D;
double value2 = 15.99D;
ts.TraceInformation("Client sends message to Add " + value1 + ", " + value2);
double result = client.Add(value1, value2);
ts.TraceInformation("Client receives Add response '" + result + "'");

ts.TraceTransfer(0, "transfer", oldID);
ts.TraceEvent(TraceEventType.Stop, 0, "Add request");
Trace.CorrelationManager.ActivityId = oldID;

Hier ist ein Weg, dass man sagen kann, von innerhalb einen service, ob oder nicht, WCF hat, propagiert eine Aktivität:

//Check if an activity was set in scope by WCF, i.e., if it was 
//propagated from the client. If not, i.e., ambient activity is 
//equal to Guid.Empty, create a new one.
if(Trace.CorrelationManager.ActivityId == Guid.Empty)
{
    Guid newGuid = Guid.NewGuid();
    Trace.CorrelationManager.ActivityId = newGuid;
}
//Emit your Start trace.
ts.TraceEvent(TraceEventType.Start, 0, "Add Activity");

//Emit the processing traces for that request.
serviceTs.TraceInformation("Service receives Add " 
                        + n1 + ", " + n2);
//double result = n1 + n2;
serviceTs.TraceInformation("Service sends Add result" + result);

//Emit the Stop trace and exit the method scope.
ts.TraceEvent(TraceEventType.Stop, 0, "Add Activity");
//return result;

Aus allen Beispielen, die ich gesehen habe, aktivitätsausbreitung ist erreicht, konfigurieren (in der Regel via app.config) für das System.Das Service-Modell TraceSource und die Einstellung seiner propagateActivity-Eigenschaft auf "true". Aktivitäten sind tatsächlich vermehrt durch die Einstellung des Aktivitäts-id (guid) auf die Spur.CorrelationManager.ActivityId. Können WCF-Protokollierung und aktivitätsausbreitung effektiv verwendet werden, wenn Sie mit log4net oder NLog?

Mein Projekt mit WCF sehr stark. Wir versuchen derzeit, sich auf unsere logging-Lösung. Ich denke, dass ich ein ziemlich gutes Verständnis davon, wie die WCF-Protokollierung und aktivitätsausbreitung arbeitet mit System.Diagnostik und TraceSources. Ich würde gerne besser verstehen, wie/ob es etwas ähnliches kann erreicht werden mit der Protokollierung Plattformen wie log4net und NLog.

Tun, stellen Sie einige "native" Unterstützung? Es scheint ein wenig wahrscheinlich, dass Sie bieten einige-Infrastruktur, so dass die aktivitätsausbreitung konnte erreicht werden, auf "manuell". Vielleicht so etwas wie dieses:

//Inside client code:
ILog logger = LogManager.GetLogger("client");
Guid oldActivity = Trace.CorrelationManager.ActivityId;
if (oldActivity == Guid.Empty)
{
  Trace.CorrelationManager.ActivityId = Guid.NewGuid();
}

using (LogManager.NDC.Push(Trace.CorrelationManager.ActivityId))
{
  log.Info("Before calling WCF Service");

  wcfService.Method();

  log.Info("After calling WCF Service");
}
Trace.CorrelationManager.ActivityId = oldActivity;

Wenn das log4net/NLog logging-format, die konfiguriert ist zum melden der Spitze des NDC-stack, dann jede Nachricht protokolliert der client (während die Tätigkeit ist im Rahmen) "tagged" mit der Aktivitäts-id. Unter der Annahme, dass der WCF-Dienst implementiert ist ähnlich, dann werden alle Meldungen protokolliert, während der service-Aufruf wird auch protokolliert werden (wenn auch wahrscheinlich in eine separate Datei) und tagged mit die gleiche Aktivitäts-id. So wird es möglich sein, um eine Korrelation zwischen den log-Nachrichten in der "service" log-Datei in den entsprechenden Nachrichten in der "client" - Protokoll.

So, wenn Sie WCF-und anmelden, hier sind einige Fragen:

  1. Verwenden Sie aktivitätsausbreitung?
  2. Verwenden Sie TraceSources für die Anmeldung?
  3. Verwenden Sie einige andere logging-Plattform (z.B. log4net, NLog)?
  4. Wenn du einen anderen logging-Plattform, wie machst du aktivitätsausbreitung?
  5. Verwenden Sie eine Mischung von Drittanbieter-Protokollierung (log4net/NLog - für die meisten logging) und System.Diagnostics.TraceSource (für WCF-Dienst-Grenze Protokollierung)?

Was ServiceTraceViewer? Verwenden Sie es? Die meisten Beispiele die ich gesehen habe, zeigen die Ausgabe generiert wird, die durch das System.Diagnose über TraceSources und die XmlTraceListener. Kann es konsumieren, Ausgabe von log4net, NLog, etc? Funktioniert es "am besten" mit TraceSource-basierte Protokollierung? Wenn ja, ist es "gut genug" zu haben, nur ein wenig von der TraceSource-basierte Protokollierung bei der WCF-service-Grenzen hinweg (Erfassung einige app-Kontext sowie die WCF-Kommunikation info) für die Anzeige in ServiceTraceViewer? Ich habe verwendet, ServiceTraceViewer kurz, nur als Teil meiner Laufenden WCF-Lern-Prozess.

Wenn Sie soweit gekommen sind, vielen Dank für das Lesen. Vielleicht bin ich overthinking die ganze integration von logging -, WCF-Aktivität, die Fortpflanzung und die Fähigkeit zum anzeigen der Protokolle in ServiceTraceViewer. Wie es scheint, eine wichtige überlegung bei der Wahl des logging-Plattform und/oder logging-Strategien, aber ich habe nicht genug Erfahrung mit dieser Protokollierung Plattformen oder WCF zu wissen, für sicher.

InformationsquelleAutor der Frage wageoghe | 2010-09-09

Schreibe einen Kommentar