Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc Can';t将用户信息输入Serilog纯文本日志_Asp.net Mvc_Httpcontext_Serilog - Fatal编程技术网

Asp.net mvc Can';t将用户信息输入Serilog纯文本日志

Asp.net mvc Can';t将用户信息输入Serilog纯文本日志,asp.net-mvc,httpcontext,serilog,Asp.net Mvc,Httpcontext,Serilog,我正在尝试实现一些简单的应用程序登录。我使用Serilog,但由于我无法控制的情况,我不能使用Seq作为接收器。现在,我被告知只需将日志写入本地文件 我能够成功地记录基本信息,但在将用户信息输入日志时遇到问题Serilog.Enrichers.Environmentspackage可以很好地获取信息,但是这些方法只能丰富日志,而在纯文本日志中是看不到的。当我使用Seq作为接收器时(我不能将其用于我的最终实现),我可以看到丰富的内容被很好地记录下来 目前我正试图从HttpContext获取用户信息

我正在尝试实现一些简单的应用程序登录。我使用Serilog,但由于我无法控制的情况,我不能使用Seq作为接收器。现在,我被告知只需将日志写入本地文件

我能够成功地记录基本信息,但在将用户信息输入日志时遇到问题
Serilog.Enrichers.Environments
package可以很好地获取信息,但是这些方法只能丰富日志,而在纯文本日志中是看不到的。当我使用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;
        }
    }
}
以下是my
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配置将此信息附加到日志正文中,而不是我如何执行此操作,我将接受该答案。

不确定您要查找的内容,但您可以使用以下内容构建自定义enricher:

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>()
.rich.With()

然后,只要
{Properties}
{CurrentUser}
是您的渲染格式,您就会得到包含的值?

enricher似乎可以工作,但我的问题是我需要它在日志的主体中。我必须将日志发送到一个纯文本文件中,而丰富内容不会显示在那里。我希望能找到一种方法,使enrichments保留到主日志中,如果这样做有意义的话,您可以添加-这将包括enrichments等的所有字段,这些字段在消息的其余部分中没有使用