Не удается получить информацию о пользователе в текстовом журнале Serilog

Я пытаюсь реализовать простой вход в приложение. Я использую Serilog, но из-за обстоятельств, не зависящих от меня, я не могу использовать Seq в качестве приемника. На данный момент мне сказали просто записывать журналы в локальный файл.

Я могу успешно регистрировать основную информацию, но у меня возникают проблемы с занесением информации о пользователе в журналы. Пакет Serilog.Enrichers.Environments отлично получает информацию, но методы только дополняют журналы, которые не видны в журнале с обычным текстом. Когда я использую Seq в качестве приемника (который я не могу использовать для моей окончательной реализации), я могу видеть, что обогащения регистрируются нормально.

В настоящее время я пытаюсь получить информацию о пользователе из HttpContext, но он возвращает null. Вот пример кода, который я пробовал:

public static class HTMLHelperExtensions
{
    public static string CurrentUser
    {
        get
        {
            HttpContext httpContext = HttpContext.Current;
            if (httpContext == null || httpContext.User == null)
                return null;

            return httpContext.User.Identity.Name;
        }
    }
}

Вот конфигурация журнала в моем Global.asax:

Log.Logger = new LoggerConfiguration()
            .Enrich.WithEnvironmentUserName()
            .WriteTo.File(
                "fileLocation.txt",
                restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information,
                rollingInterval: RollingInterval.Infinite,
                fileSizeLimitBytes: 10485760, //10MiB
                retainedFileCountLimit: 50 )                
            .WriteTo.Seq("http://localhost:5341")
            .CreateLogger();

И откуда я вызываю код:

public class HomeController : Controller
{
    public ActionResult Index()
    {

        Log.Information("Application initial load. Included in Audit Log: {auditLog}. User: {User}", true, HTMLHelperExtensions.CurrentUser);
        //other code

        return View();
    }
}

Метод .Enrich.WithEnvironmentUserName() работает отлично, но я не знаю, как поместить эту информацию в фактическое тело журнала вместо дополнения.


person Justin    schedule 17.05.2018    source источник


Ответы (2)


Не уверен, что вы ищете, но вы можете создать собственный обогатитель с помощью:

class CurrentUserEnricher : Serilog.Core.ILogEventEnricher
{
    public void Enrich(Serilog.Events.LogEvent logEvent, Serilog.Core.ILogEventPropertyFactory lepf) =>
        logEvent.AddPropertyIfAbsent(lepf.CreateProperty("CurrentUser", HTMLHelperExtensions.CurrentUser));
}

И включить в конвейер с:

.Enrich.With<CurrentUserEnricher>()

Тогда, пока {Properties} или {CurrentUser} находится в вашем формате рендеринга, вы получите включенное значение?

person Ruben Bartelink    schedule 17.05.2018
comment
Enricher вроде работает, но моя проблема в том, что он мне нужен в основной части журнала. Мне нужно отправить журналы в обычный текстовый файл, и обогащения там не отображаются. Я надеюсь найти способ перенести обогащения в основной журнал, если это имеет смысл. - person Justin; 18.05.2018
comment
Вы можете добавить {Properties} в строку формата для основного журнала - это будет включать все поля из enrichers и т. д., которые не используются в остальной части сообщения - person Ruben Bartelink; 19.05.2018

Я пока в этом разобрался. Если я использую httpContext.Request.LogonUserIdentity.Name вместо httpContext.User.Identity.Name, он дает мне нужную мне информацию.

Если есть способ использовать конфигурацию Serilog для добавления этой информации в тело журнала вместо того, как я это делаю, я приму этот ответ.

person Justin    schedule 17.05.2018