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