使用appSettings配置自定义Serilog sink

4

我创建了一个新的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的方法?

谢谢。

1个回答

4

我认为你最可能需要一个serilog:using指令,用于包含新的sink的程序集:

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

如果您需要为多个附加的接收器指定此内容,请通过添加短名称使键唯一:

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

无论短名称是什么,只要它在应用程序设置键中是唯一的即可。

那就是问题所在!我添加了一个“serilog:using”键,其中包含DiagnosticsBroadcaster sink的程序集名称,现在它可以工作了。谢谢! - programmerj
当我放置自定义 sink 的程序集文件时,出现了“## 无法识别的配置部分 add。##”的错误信息... 我应该验证什么? - advapi
1
@advapi 听起来你需要将它嵌套在 <appSettings> 下面。 - Nicholas Blumhardt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接