2017-03-24 6 views
1

Ich habe eine sehr spezifische Anforderung.asp.net Protokollierung und Datei erstellen jede Stunde

Ich habe eine .net Web API, und ich muss alles protokollieren, ich muss protokollieren, wenn jede API-Methode aufgerufen wird, von wem, Zeit, muss ich protokollieren, wenn es kontrollierte und unkontrollierte Ausnahmen gibt.

Mein Hauptanliegen ist: 1. Ist das mit DI möglich? Ich würde nicht gerne eine Logger-Zeile auf dem Code manuell überall hinzufügen. 2. Wie kann ich die Datei nach 1 Stunde schließen und automatisch eine neue erstellen?

+0

Ich habe gehört, Log4Net ist gut für Dinge wie diese, ich benutze Elmah Ausnahmen und Zugriffsverletzungen zu protokollieren, aber tut Dazu muss manuell eine Codezeile hinzugefügt werden.Um jede Stunde eine Datei zu erstellen: Erstellen Sie eine Datei mit einem Zeitstempel. Wenn Sie sich anmelden müssen, überprüfen Sie den Dateinamen und vergleichen Sie den Zeitstempel mit der aktuellen Uhrzeit. Wenn seit der Erstellung mehr als eine Stunde verstrichen ist, erstellen Sie die neue Datei mit dem neuen Zeitstempel. Sie können auch die Ablaufverfolgung verwenden. – Ingenioushax

+0

Es gibt High-Performance-Tools wie AppDynamics, die im Wesentlichen alle Ihre App protokollieren und korrelieren, aber sie sind nicht billig. Ich kenne kein Tool, das jeden API-Aufruf protokolliert, ohne manuell Loggerzeilen hinzuzufügen. –

Antwort

1

Sicher ist dies möglich. Ich habe meine Antwort auf .Net Core, aber das meiste (wie der Logger vorgeschlagen und die Verwendung von Middleware) gilt auch für nicht .Net Core-Projekte.

Für den Anfang empfehle ich Ihnen diese Zeilen lesen: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging

ASP.NET-Core unterstützt ein Logging-API, die mit einer Vielzahl von Logging-Anbieter arbeitet. Mit den integrierten Providern können Sie Protokolle an ein oder mehrere Ziele senden. Außerdem können Sie ein Protokollierungsframework eines Drittanbieters verwenden.

ASP.NET Core Dependency Injection (DI) stellt die ILoggerFactory-Instanz bereit.

Sie können Ihre Protokollimplementierung über die Schnittstellen ILogger und ILoggerFactory injizieren.

Für Ausnahmebehandlung und Zugriffsprotokollierung können Sie einige Middleware (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware) schreiben. Die Verwendung von Middleware verhindert, dass Sie Ihre Logging-Logik bei jeder Controller-Aktion aufrufen müssen.

Etwas wie:

public class RequestTrackingMiddleware 
    { 
     private readonly RequestDelegate next; 
     private readonly ILogger logger; 

     public RequestTrackingMiddleware(RequestDelegate next, ILogger logger) 
     { 
      this.next = next; 
      this.logger = logger; 
     } 

     public async Task Invoke(HttpContext context) 
     { 
      using (logger.BeginScope(new Dictionary<string, object> 
      { 
       [SharedProperties.TraceId] =   context.Request.HttpContext.TraceIdentifier, 
      })) 
      { 
       var stopwatch = Stopwatch.StartNew(); 
       bool success = false; 

       try 
       { 
        await next(context); 
        success = true; 
       } 
       catch (System.Exception exception) 
       { 
        logger.LogCritical((int)ServiceFabricEvent.Exception, exception, exception.Message); 
        throw; 
       } 
       finally 
       { 
        stopwatch.Stop(); 
        logger.LogRequest(context, stopwatch.Elapsed, success); 
       } 
      } 
     } 
    } 

Jetzt, da der Link früher gibt es einige eingebaute und 3rd-Party-Logger-Implementierungen, die die mitgelieferte .Net Bohrkern interfaces.Pick eine Unterstützung, die ein Waschbecken (destionation) hat nach Ihren Wünschen oder schreiben Sie eine Senke selbst (die meisten Zeiten, die nicht so schwer ist basierend auf dem Logger.

Ich habe Serilog (https://serilog.net/) verwendet, da das hat Out-of-the-Box-Unterstützung für .Net Core und Es hat viele Senken. Wenn Sie nicht .Net Core verwenden, ist dies immer noch eine gute Wahl!

Edit: ich Serilog sehen eine Datei-basierte Senken unterstützt, die jede Stunde eine neue Datei erzeugt: https://github.com/serilog/serilog-sinks-rollingfile

1

Sie können log2net verwenden. Mit den folgenden 2 Eigenschaften können Sie jede Stunde eine Protokolldatei erstellen. Wenn Sie das gleiche Muster von Anmeldemethoden haben (Ex - Wrap - Methode mit Protokolleinträgen), dann können Sie auch AOP (Aspect oriented programing). PostSharp ist sehr nützlich in AOP.

<rollingStyle value="Date" /> 
<datePattern value="yyyyMMdd-HH" /> 

ex-

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="logfile" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Date" /> 
    <datePattern value="yyyyMMdd-HH" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
</appender> 

http://logging.apache.org/log4net/release/config-examples.html#rollingfileappender

https://www.postsharp.net/aspects

Verwandte Themen