Есть ли такая вещь, как HTTPContextEnricher, которая работает с Servicestack и Serilog - PullRequest
1 голос
/ 07 февраля 2020

Я использую Servicetack (.Core) и это соединение с Serilog. Есть ли способ автоматически обогатить все записи в журнале такими вещами, как SessionId, UserId и т. Д. c. Serilog-enrichers не будут работать, поскольку servicetack использует свою собственную сессию и пользовательскую обработку.

С уважением

Майкл

1 Ответ

1 голос
/ 10 февраля 2020

Я использую аналогичную конфигурацию. Этот код вызывается на Application_Start

if (Settings.SeqEnabled)
            Log.Logger = new LoggerConfiguration()
                .Enrich.With<HttpRequestClientHostIPEnricher>()
                .Enrich.With<HttpRequestClientHostNameEnricher>()
                .Enrich.With<HttpRequestIdEnricher>()
                .Enrich.With<HttpRequestNumberEnricher>()
                .Enrich.With<HttpRequestRawUrlEnricher>()
                .Enrich.With<HttpRequestTraceIdEnricher>()
                .Enrich.With<HttpRequestTypeEnricher>()
                .Enrich.With<HttpRequestUrlEnricher>()
                .Enrich.With<HttpRequestUrlReferrerEnricher>()
                .Enrich.With<HttpRequestUserAgentEnricher>()
                .Enrich.With<HttpSessionIdEnricher>()
                .Enrich.With<ServiceStackUserNameEnricher>()
                .WriteTo.Seq(HostContext.AppSettings.GetString("SeqUrl"))
                .CreateLogger();

. Эти обогатители используют пространство имен SerilogWeb.Classi c .Enrichers.

ServiceStackUserNameEnricher - мой класс.

public class ServiceStackUserNameEnricher : ILogEventEnricher
{
    private const string UserNamePropertyName = "UserName";

    public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
    {
        if (logEvent == null)
            throw new ArgumentNullException(nameof(logEvent));
        string str;
        try
        {
            str = HttpContext.Current != null ? HostContext.GetCurrentRequest().GetSession().UserName : null;
        }
        catch
        {
            return;
        }
        if (str == null)
            return;
        var property = new LogEventProperty(UserNamePropertyName, new ScalarValue(str));
        logEvent.AddPropertyIfAbsent(property);
    }
}

Пакеты для Serilog

  <package id="Serilog" version="2.9.0" targetFramework="net46" />
  <package id="Serilog.Formatting.Compact" version="1.0.0" targetFramework="net46" />
  <package id="Serilog.Sinks.File" version="4.0.0" targetFramework="net46" />
  <package id="Serilog.Sinks.PeriodicBatching" version="2.1.1" targetFramework="net46" />
  <package id="Serilog.Sinks.Seq" version="4.0.0" targetFramework="net46" />
  <package id="SerilogWeb.Classic" version="5.0.52" targetFramework="net46" />
...