我正在尝试将用户名添加到我的日志中。文档显示:
new_comain.com
但是,我读过其他一些文章,我需要使用中间件将用户名添加到日志中。
这是我到目前为止所拥有的:
使用中间件获取当前用户的用户名
class ThreadIdEnricher : ILogEventEnricher
{
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{
logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty(
"ThreadId", Thread.CurrentThread.ManagedThreadId));
}
}
Startup.cs
public class UserNameEnricher
{
private readonly RequestDelegate next;
public UserNameEnricher(RequestDelegate next)
{
this.next = next;
}
public Task Invoke(HttpContext context)
{
LogContext.PushProperty("UserName", context.User.Identity.Name);
return next(context);
}
}
Program.cs
app.UseAuthentication();
app.UseMiddleware<UserNameEnricher>();
尽管进行了所有这些配置,但用户名仍然没有出现。我想念什么?
Serilog配置:
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.Filter.ByExcluding(Matching.FromSource("Microsoft"))
.Filter.ByExcluding(Matching.FromSource("System"))
.Enrich.FromLogContext()
.CreateLogger();
答案 0 :(得分:1)
要使其正常工作,您需要指定outputTemplate
。
事件的属性,包括使用扩充程序附加的属性,也可以显示在输出模板中。
这是一个用于RollingFile
的演示代码。
var output = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message} {ActionName} {UserName} {NewLine}{Exception}";
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext() // Populates a 'User' property on every log entry
.WriteTo.RollingFile("Logs/app-{Date}.txt",outputTemplate: output)
.CreateLogger();
注意
输出中的 {UserName}
应该映射UserName
中的LogContext.PushProperty("UserName", context.User.Identity.Name);
。
更新:
通过appsetting.json
"Serilog": {
"MinimumLevel": "Information",
"Override": {
"Microsoft": "Critical"
},
"WriteTo": [
{
"Name": "RollingFile",
"Args": {
"pathFormat": "Logs/app-{Date}.txt",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message} {UserName} {ActionName} {NewLine} {Exception}"
}
}
]
}