2017-05-09 4 views
0

Ich habe eine ASPNET Core-Anwendung und ermöglicht Protokolle mit diesen Aussagen gebaut.Wie kontrolliere ich die Protokollebene für Azure-Diagnoseprotokolle?

loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
    loggerFactory.AddDebug((category, logLevel) => (category.Contains("WEBAPI") && logLevel >= LogLevel.Trace)); 
    loggerFactory.AddAzureWebAppDiagnostics(); 

Das Problem ist jetzt, dass die Azure Log viele andere Protokoll Detail hat aus den Paketen Mircosoft kommt, dass ich nicht interessiert bin ich scheint meine Protokollierungskonfiguration nicht wie Azure für das Konsolenprotokoll zu übergeben.

Fehle ich, wie ich das Diagnosesystem verwenden sollte?

+1

Was ist das Protokolldetail im Portal? Sie sollten in der Lage sein, das Niveau dort z. Warnung. – juunas

+0

@juunas Es ist auf Ausführlich gesetzt, was ich fragen wollte ist, wie ich die Ebene nach Kategorie steuern kann. Das kann ich nicht herausfinden. –

Antwort

1

Wenn Sie die Anwendungsdiagnose unter Azure-Portal aktivieren, können Sie auch das Level auswählen. Mit dieser Einstellung können Sie die erfassten Informationen zu Informations-, Warn- oder Fehlerinformationen filtern.

enter image description here

Die Verbose Ebene bedeutet, dass die Log-System werden alle Informationen in der Anwendung erstellte protokollieren.

Das Problem ist jetzt, dass die Azure Log viele andere Protokoll Detail hat aus den Paketen Mircosoft kommt, dass ich in. Nicht interessiert bin

Sie könnten das Niveau auf Azure-Portal ändern, die Protokolle zu filtern Welchen willst du speichern. Sie können das Level auf dem Azure-Portal jederzeit ändern. Im Gegensatz zur Änderung der Datei web.config wird beim Ändern der Diagnoseprotokollebenen die Anwendungsdomäne, in der die Anwendung ausgeführt wird, nicht wiederverwendet.

Ich möchte Protokolle von Kategorien ausschließen, die nicht meine sind, nur Linie, die ich in der ersten Zeile in meiner Frage mit der Konfig.

Die Azure Web App-Protokollerweiterung unterstützt keine Filterprotokolle nach Kategorie. Sie können einen neuen Logger erstellen, der diese Funktion implementiert.

Es gibt 3 Schritte, um es zu beenden.

Schritt 1: Fügen Sie eine CustomLogger-Klasse hinzu, die eine ILogger-Schnittstelle implementieren muss. In dieser Klasse könnten wir Protokolle nach Ebene und Kategorie filtern und Protokollmeldungen an jeder gewünschten Stelle speichern.

public class CustomLogger : ILogger 
{ 

    private string _categoryName; 

    private Func<string, LogLevel, bool> _filter; 

    public CustomLogger(string categoryName, Func<string, LogLevel, bool> filter) 
    { 
     _categoryName = categoryName; 
     _filter = filter; 
    } 


    public IDisposable BeginScope<TState>(TState state) 
    { 
     return null; 
    } 

    public bool IsEnabled(LogLevel logLevel) 
    { 
     return (_filter == null || _filter(_categoryName, logLevel)); 
    } 

    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) 
    { 

     if (!IsEnabled(logLevel)) 
     { 
      return; 
     } 

     if (formatter == null) 
     { 
      throw new ArgumentNullException(nameof(formatter)); 
     } 

     var message = formatter(state, exception); 

     if (string.IsNullOrEmpty(message)) 
     { 
      return; 
     } 

     message = [email protected]"Level: {logLevel} {message}"; 

     if (exception != null) 
     { 
      message += Environment.NewLine + Environment.NewLine + exception.ToString(); 
     } 

     //save message to any place you wanted 
    } 
} 

Schritt 2: eine CustomLoggerProvider Klasse hinzufügen, die ILoggerProvider Schnittstelle implementieren müssen. In dieser Klasse erstellen wir eine Instanz von CustomerLogger, um Informationen zu protokollieren.

public class CustomLoggerProvider : ILoggerProvider 
{ 
    private readonly Func<string, LogLevel, bool> _filter; 

    public CustomLoggerProvider(Func<string, LogLevel, bool> filter) 
    { 
     _filter = filter; 
    } 

    public ILogger CreateLogger(string categoryName) 
    { 
     return new CustomLogger(categoryName, _filter); 
    } 

    public void Dispose() 
    { 

    } 
} 

Schritt 3: CustomLoggerExtensions Klasse hinzufügen, die CustomLoggerProvider Instanz Logger Werk hinzuzufügen verwendet wird.

Nach den oberen Schritten konnten wir diesen benutzerdefinierten Logger mit dem folgenden Code verwenden.

loggerFactory.AddCustom((category, logLevel) => (category.Contains("WEBAPI") && logLevel >= LogLevel.Trace)); 
+0

Dies ist eine großartige Information! Aber was ich wirklich meinte, ist, dass ich basierend auf Kategorie filtern möchte ... Ich möchte Protokolle von Kategorien ausschließen, die nicht meine sind, nur Linie, die ich in der ersten Zeile in meiner Frage mit der Konfiguration mache. –

+0

Es tut mir leid, dass Sie Ihre Frage falsch verstanden haben. Ich habe meine Antwort basierend auf Ihrem Kommentar aktualisiert. – Amor

+0

Wow! Das ist eine Antwort! Vielen Dank. –

Verwandte Themen