Не удается получить информацию о пользователе в текстовом журнале Serilog - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь реализовать простой вход в приложение. Я использую 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() работает просто отлично, но я не знаю, как перенести эту информацию в фактическое тело журнала вместо обогащения.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

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

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} в вашем формате рендера, вы получите включенное значение?

0 голосов
/ 17 мая 2018

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

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

...