无法将用户信息获取到Serilog纯文本日志中

Can't get user information into Serilog plain text log

我正在尝试实现一些简单的应用程序登录。我正在使用 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() 方法工作得很好,但我不知道如何将该信息放入日志的实际主体而不是充实。

我现在想通了。如果我使用 httpContext.Request.LogonUserIdentity.Name 而不是 httpContext.User.Identity.Name,它会提供我想要的信息。

如果有办法使用 Serilog 配置将此信息附加到日志正文而不是我正在做的,我会接受这个答案。

不确定您要寻找什么,但您可以使用以下方法构建自定义增强器:

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} 在您的渲染格式中,您就会得到包含的值 ?