2014-07-22 1 views
4

J'ai créé un nouveau récepteur personnalisé Serilog et j'essaie de le configurer via appSettings.Utilisation de appSettings pour configurer un récepteur Serilog personnalisé

Le récepteur personnalisé s'appelle 'DiagnosticsBroadcaster'. Son extension LoggerSinkConfiguration est:

public static LoggerConfiguration DiagnosticsBroadcaster(
     this LoggerSinkConfiguration loggerConfiguration, 
     string defaultLoggerName = "serilog", 
     LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum, 
     IFormatProvider formatProvider = null) 
    { 
     if (loggerConfiguration == null) 
     { 
      throw new ArgumentNullException("loggerConfiguration"); 
     } 

     if (defaultLoggerName == null) 
     { 
      throw new ArgumentNullException("defaultLoggerName"); 
     } 

     return loggerConfiguration.Sink(new DiagnosticsBroadcaster(defaultLoggerName,  formatProvider), restrictedToMinimumLevel); 
    } 

La classe évier DiagnosticsBroadcast est:

public class DiagnosticsBroadcaster : ILogEventSink, IDisposable 
{ 
    private OMMHttpClient _clientApp = null; 
    private readonly string _defaultLoggerName = string.Empty; 
    private readonly IFormatProvider _formatProvider = null; 
    private readonly object _syncRoot = new object(); 
    private bool _isDisposed = false; 

    //---------------------------------------------------------------------------------------------------- 
    //----------------------------------------------------------------------------------------------------  
    public DiagnosticsBroadcaster(string defaultLoggerName, IFormatProvider formatProvider = null) 
    { 
     if (string.IsNullOrEmpty(defaultLoggerName)) 
     { 
      throw new ArgumentException("defaultLoggerName"); 
     } 

     _defaultLoggerName = defaultLoggerName; 
     _formatProvider = formatProvider; 

     string ommDispatcherUrl = ConfigurationManager.AppSettings["OMMDispatcherUrl"]; 

     _clientApp = new OMMHttpClient(ommDispatcherUrl, "api/omm/diag/app");    
    } 

    //---------------------------------------------------------------------------------------------------- 
    //---------------------------------------------------------------------------------------------------- 
    public void Emit(Serilog.Events.LogEvent logEvent) 
    { 
     var loggerName = _defaultLoggerName; 

     string message; 

     lock (_syncRoot) 
     { 
      if (_isDisposed) 
      { 
       throw new ObjectDisposedException("The OMMJHttpClient has been disposed."); 
      } 

      if (logEvent.Exception != null) 
      { 
       message = string.Format("{0} -- EXCEPTION: {1}", logEvent.RenderMessage(_formatProvider), logEvent.Exception.Message); 
      } 
      else 
      { 
       message = logEvent.RenderMessage(_formatProvider); 
      } 

      Task.Factory.StartNew(async() => 
      { 
       try 
       { 
        HttpResponseMessage response = await _clientApp.Post<string>(message); 

        if (!response.IsSuccessStatusCode) 
        { 
         Log.Warning("Error sending diagnostic message [APP] - {0} - {1}", response.StatusCode, response.ReasonPhrase); 
        } 
       } 
       catch (Exception ex) 
       { 
        Log.Warning("Error sending diagnostic message [APP] - {0}", ex.Message); 
       } 
      }); 
     } 
    } 

    //---------------------------------------------------------------------------------------------------- 
    //---------------------------------------------------------------------------------------------------- 
    public void Dispose() 
    { 
     lock (_syncRoot) 
     { 
      if (_clientApp != null) 
      { 
       _clientApp.Dispose(); 
       _isDisposed = true; 
      } 
     } 
    } 
} 

Cet évier personnalisé fonctionne si je configure comme suit:

Log.Logger = new LoggerConfiguration() 
          .ReadAppSettings() 
          .WriteTo.DiagnosticsBroadcaster(restrictedToMinimumLevel: LogEventLevel.Information)        
          .CreateLogger(); 

Mais ses méthodes ne sont jamais appelés si Je tente de le configurer via appSettings:

<add key="serilog:write-to:DiagnosticsBroadcaster.restrictedToMinimumLevel" value="Information" /> 

Des suggestions sur la façon dont je peux configurer DiagnosticsBroadcaster via appSettings?

Merci.

Répondre

3

Je pense que vous êtes très probablement besoin d'une directive serilog:using pour l'assemblage qui contient le nouvel évier:

<add key="serilog:using" value="YourCompany.YourAssembly" /> 

Si vous devez spécifier pour plus d'un évier supplémentaire, faire les clés distincte en ajoutant un nom court:.!

<add key="serilog:using:Diag" value="YourCompany.YourAssembly" /> 

(peu importe ce que le nom court est, seulement qu'il est

+0

clés uniques parmi les paramètres d'application qui était la question que j'ajouté une clé "serilog: using" avec le nom de l'assembly contenant le puits DiagnosticsBroadcaster et cela fonctionne maintenant. Merci! – programmerj

+0

Im 'getting ## Section de configuration non reconnue ajouter ## quand je mets mon fichier d'assemblage pour un récepteur personnalisé ... que puis-je vérifier? – advapi

+1

@advapi sonne comme si vous deviez l'imbriquer sous '' –

Questions connexes