7

recently habe ich Serilog (strukturierte Protokollierung für .net) entdeckt und viele seiner Vorteile gesehen. aber ich habe einige Probleme damit. ich habe 4 Projekte, eins ist Web, eins ist Infrastruktur und die anderen beiden sind Windows-Dienste, ich möchte Serilog-Konfiguration einmal erklären und es mehrmals verwenden. und ich möchte es auch mit Abhängigkeitsinjektion verwenden. Ich habe jetzt Web für drei Tage gesucht, aber ich habe nichts nützliches gefunden, bitte helfen mir einige.Wie verwende ich Serilog mit Unity?

zum Beispiel möchte ich diese Klasse meine Protokollierungsklasse sein.

public interface IMyLogger 
{ 
    void Information(string message, object[] parameters); 
} 

public class MyLogger : IMyLogger 
{ 
    public MyLogger() 
    { 
    } 
    public void Information(string message, object[] parameters) 
    { 
     Log.Information("LogType : {LogType} - Operation : {Operation}", parameters); 
    } 
} 
public class UserClass 
{ 
private readonly IMyLogger _myLogger; 
public UserClass(IMyLogger myLogger) 
     { 
      _myLogger = myLogger; 
     } 
} 

jetzt weiß ich nicht, wo ich diese Codezeile setzen sollte:

Log.Logger = new LoggerConfiguration() 
      .WriteTo.Console() 
      .CreateLogger(); 

tnx im Voraus.

Antwort

4

First off, in der Unity-Konfiguration, Serilog Lösung richtig zu erhalten, müssen Sie eine InjectionFactory verwenden, wie folgt aus:

 container.RegisterType<ILogger>(new ContainerControlledLifetimeManager(), new InjectionFactory((ctr, type, name) => 
     { 
      ILogger log = new LoggerConfiguration() 
       .WriteTo.Console() //Your serilog config here 
       .CreateLogger(); 

      return log; 
     })); 

In meiner Implementierung ich abstrahieren Serilog nicht, aber der Code oben ist das fehlende Glied in jedem Fall. IMyLogger muss nur ILogger Parameter eingeben, und alles wird sich ausarbeiten.

Das löst den MVC-Teil: Sie können IMyLogger in Ihre Controller in MVC injizieren.

Welche bringt uns zu wo in Ihrer Lösung zu finden. Aufgrund Ihrer Anforderungen in Bezug auf Dienste benötigen Sie wahrscheinlich ein separates Inversion-of-Control-Projekt (MySolution.InversionOfControl), das Ihre Bindungen enthält. Dann, zum Beispiel in Ihrer Website der UnityWebActivator.cs, können Sie etwas tun:

/// <summary>Integrates Unity when the application starts.</summary> 
    public static void Start() 
    { 
     //This is the important part: 
     var container = UnityConfig.GetConfiguredContainer(); //This is a static class in the InversionOfControl project. 

     //This is generic: 
     FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First()); 
     FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container)); 

     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 
    } 

das gleiche tun für Ihre Dienste, und Sie sollten gut zu gehen!

+0

Das funktioniert gut. Mir ist aufgefallen, dass der Standard Lifetime Manager, wenn keiner in Unity 4.0.1 angegeben ist, der transiente Lifetime Manager ist. Dies bedeutet, dass jeder Aufruf zum Auflösen des ILoggers die Injektionsfabrik ausführt und eine neue Instanz zurückgibt. Ich glaube, der Logger sollte stattdessen ContainerControllerLifetimeManager verwenden? – dotnetguy

+0

@dotnetguy Besser spät als nie, ich aktualisiere dies jetzt. :) –

+1

Für alle anderen: ContainerControllerLifetimeManager macht die beste Arbeit, das Singleton-Verhalten nachzuahmen, für das Serilog gedacht war. Andere Lebenszeitmanager arbeiten zwar, aber dies ist möglicherweise etwas effizienter als das Erstellen einer neuen Serilog-Instanz für jede Anforderung. –