簡體   English   中英

使用appSettings配置自定義Serilog接收器

[英]Using appSettings to configure a custom Serilog sink

我創建了一個新的Serilog自定義接收器,並嘗試通過appSettings配置它。

自定義接收器名為“DiagnosticsBroadcaster”。 其LoggerSinkConfiguration擴展名為:

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);
    } 

DiagnosticsBroadcast接收器類是:

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;
            }
        }
    }
}

如果我按如下方式配置,則此自定義接收器可用:

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

但是如果我嘗試通過appSettings配置它,它的方法永遠不會被調用:

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

有關如何通過appSettings配置DiagnosticsBroadcaster的任何建議?

謝謝。

我認為你最有可能需要一個serilog:using包含新接收器的程序集的指令:

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

如果您需要為多個附加接收器指定此項,請通過附加短名稱使密鑰更加明確:

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

(短名稱是什么並不重要,只是它在應用程序設置鍵中是唯一的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM