2017-11-13 1 views
0

Ich habe ein ASP.NET-Projekt, das seine Protokolle an NLog sendet.Umleiten Sie alle ASP.NET Core-Protokollierung in einen einzigen NLog-Logger

Allerdings habe ich in diesem Projekt meinen eigenen NLog Logger und würde gerne wissen, wie man alle Logs durchleitet.

Ich denke, ich sollte NLog nicht als Logger hinzufügen, aber ich sollte einen Weg finden, eine Methode zu registrieren, die jedes Mal aufgerufen wird, wenn ASP versucht, etwas zu protokollieren.

Wie kann dies erreicht werden?


Dies ist der Code, den Logger erstellt:

 // create the module name 
     var ProcessName = Process.GetCurrentProcess().ProcessName; 
     _ModuleName = ProcessName + " (\"" + Oracle.GuessMyName() + "\")"; 

     // create the logger configuration 
     var Configuration = new LoggingConfiguration(); 

     // create the file target 
     var FileTarget = new FileTarget ("file") 
     { 
      FileName   = @"x:\Logs\${processname}.log", 
      ArchiveFileName  = @"x:\Logs\${processname}.{#}.log", 
      Layout    = @"${longdate}|${logger}|${level}|${message}${onexception:|Exception occurred:${exception:format=tostring}${newline}", 
      ArchiveEvery  = FileArchivePeriod.Day, 
      ArchiveNumbering = ArchiveNumberingMode.Rolling, 
      MaxArchiveFiles  = 7, 
      ConcurrentWrites = true 
     }; 

     Configuration.AddTarget(FileTarget); 


     // create the viewer target 
     var ViewerTarget = new NLogViewerTarget ("viewer") 
     { 
      Layout    = @"${message}${onexception:${newline} --> Exception occurred\:${exception:format=tostring}", 
      IncludeSourceInfo = true, 
      IncludeCallSite  = true, 
      Address    = @"udp://127.0.0.1:9999" 
     }; 

     Configuration.AddTarget(ViewerTarget); 

     // set the rules 
     Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, FileTarget)); 
     Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, ViewerTarget)); 

     // set the configuration 
     LogManager.Configuration = Configuration; 

     // create a new logger 
     _Logger = LogManager.GetLogger(_ModuleName); 

und dies ist auch, wie ASP.net angebracht wird, um nlog:

 LoggerFactory.AddNLog(); 
     Application.AddNLogWeb(); 

Nun ist das aktuelle Protokoll Layout sieht aus wie dies für zwei Prozesse (die Tiernamen ändern sich automatisch bei jedem Neustart des Prozesses) log layout

so beide Prozesse: Shinobi und Mouserun haben hier ihre eigene Log-Ausgabe, aber alles, was mit ASP zu tun hat, geht an ASPs nlog-Instanz namens Microsoft, unabhängig vom Prozess.

Ziel ist es, die ASP-Ausgabe von Shinobi in den Shinobi-Logger und die Mouserun ASP-Ausgabe in den Mouserun-Logger gehen zu gehen.

+0

nein, ich etwas wollte, das von der Microsoft geht Shinobi-Prozess, um zum Shinobi-Logger zu gehen und alles, was von Mouserun zu Microsoft geht, um zum Mouserun-Prozess zu gehen s. Ich möchte nicht, dass ASP auf nlog protokolliert, ich möchte, dass ASP mir einen Rückruf gibt, wenn er etwas protokollieren will, damit ich in den Prozess schreiben kann. Logger – Thomas

+0

Hinzufügen, so dass es die Log4J XML-Ausgabe ist, die einen Logger-Namen enthält Du hast irgendwie alles konfiguriert. Das Dateiziel funktioniert einwandfrei. –

+0

ja, die Dateiausgabe funktioniert gut, aber die UDP ist nicht – Thomas

Antwort

1

Sehen Sie sich den Code von NLog.Extensions.Logging an, wo er seinen eigenen benutzerdefinierten Protokollanbieter eingibt.

können Sie das gleiche tun und wickeln Sie einfach Ihre global-Logger-Objekt:

https://github.com/NLog/NLog.Extensions.Logging/blob/e48d6cc54d9abd70d976066265c7992117cbac5a/src/NLog.Extensions.Logging/NLogLoggerProvider.cs

https://github.com/NLog/NLog.Extensions.Logging/blob/1474ffe5b26d2ac95534ed01ef259133133bfb67/src/NLog.Extensions.Logging/NLogLoggerFactory.cs

https://github.com/NLog/NLog.Extensions.Logging/blob/2c05a4fbdda0fe026e60814d535e164e18786aef/src/NLog.Extensions.Logging/ConfigureExtensions.cs

public static ILoggerFactory AddNLog(this ILoggerFactory factory, NLogProviderOptions options) 
    { 
     ConfigureHiddenAssemblies(); 

     using (var provider = new NLogLoggerProvider(options)) 
     { 
      factory.AddProvider(provider); 
     } 
     return factory; 
    } 
+0

Genau das, was ich brauchte! Vielen Dank für all die Zeit, die Sie dafür aufgewendet haben! – Thomas

+0

Erstellt https://github.com/NLog/NLog/pull/2390, sodass Sie LoggerName direkt auf NLogViewerTarget überschreiben können. –

+1

@Thomas NLog 4.5 RC wurde veröffentlicht, das die obige PR enthält, so dass Sie jetzt keine eigene Erweiterungslogik implementieren müssen, um den Logger-Namen im NLogViewerTarget zu überschreiben. Verwenden Sie einfach NLogViewerTarget.LoggerName –

0

Sie auch ein benutzerdefiniertes Ziel schaffen könntest, und lenkt alle nicht-global-Logger-Nachrichten an dieses Ziel NLog Regeln:

https://github.com/nlog/NLog/wiki/Configuration-file#rules

Das benutzerdefinierte Ziel kann dann nach vorne nur dem Log-Ereignisse der global-Logger:

https://github.com/NLog/NLog/wiki/How-to-write-a-custom-target

Sie sollten mit zyklischer Protokollierung vorsichtig sein. Vielleicht haben Sie im Custom-Target einen Filter, um Nachrichten von der Global-Logger zu ignorieren.

Aber ich denke, das ist eine hässliche Lösung, und ich verstehe nicht die Einschränkung von nur einem Logger-Objekt. Vor allem, wenn der Grund ist, weil es nach der Anwendung benannt werden sollte. Warum nicht eine globale Variable für den Namen, anstatt den Loggernamen zu missbrauchen?

+0

Der Grund dafür ist, dass auf demselben System einige Programme dieselbe Bibliothek verwenden, die gleichzeitig die Protokollierung zentralisiert. und bei jeder neuen Ausführung dieser Programme benötigen wir eine neue Protokolldatei. Wenn die App gestartet wird, erzeugt sie einen Namen (ihren Basisnamen + einen zufälligen Teil) und alles, was von dieser spezifischen Instanz ausgegeben wird, muss durch einen Logger laufen, der so benannt ist (wir brauchen UDP + -Dateien). – Thomas

+0

das System funktioniert sehr gut, aber für ASP, weil die Nlog-Integration erstellt eine Logger-Instanz namens "Microsoft" und alles ASP durchgehen, durch Mischen der ASP-Ausgaben aller Anwendungen in der UDP-Logger, da die Daten nach Logger-Name – Thomas

+0

sortiert ist Also, die aktuelle Lösung funktioniert, aber ich brauche nur einen Haken in ASP, so dass * I * kann protokollieren die Ausgabe protokollieren, anstatt ASP tut es direkt. Dazu würde ich die ASP/Nlog-Integration entfernen und für jede Nachricht, die ich erhalte, würde ich sie einfach an den Logger der Anwendungsinstanz weiterleiten. – Thomas

0

Alternativ können Sie einen benutzerdefinierten Zielwrapper erstellen, der den Logger auf LogEventInfo's fixiert. Wenn er also zum umschlossenen Ziel (UDP-/Dateiziel) weitergeleitet wird, sieht es so aus, als kämen alle aus demselben Logger.

ähnlich wie dieser Kerl versucht zu tun:

https://github.com/NLog/NLog/issues/2352

Wieder wirklich hässliche Lösung, und soll nur verwendet werden, wenn nicht in der Lage, um herauszufinden, wie man vermeiden, den Logger-Namen in der Verwendung Konfiguration der gewünschten Nlog-Ziele (Bsp. Datei-Ziel-Dateiname mit etwas anderem konfigurieren).

Verwandte Themen