#c# #asp.net-core #serilog
#c# #asp.net-ядро #serilog
Вопрос:
ASP.NET Core 2.2.0
| Serilog.AspNetCore 2.1.1
| Serilog.Sinks.File 4.0.0
Я инициализирую Serilog в Program.cs, считываю конфигурацию из appsettings.json и добавляю промежуточное программное обеспечение в Startup.cs -> Configure. Некоторые фрагменты:
Program.cs
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.CreateLogger();
try
{
Log.Information("Starting web host");
CreateWebHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseConfiguration(Configuration)
.UseSerilog();
Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment() || env.IsStaging())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
app.UseRewriter(new RewriteOptions()
.AddRedirectToWww()
.AddRedirectToHttps());
}
app.UseSession();
app.UseAuthentication();
app.UseMiddleware<SerilogAddUserInfo>();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc();
}
appsettings.json
"Serilog": {
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Information",
"System": "Warning"
}
},
"Enrich": "FromLogContext",
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "logs/log.txt",
"rollingInterval": "Hour",
"outputTemplate": "{Timestamp:o} [{Level:u3}] [IP {Address}] [Session {Session}] [{SourceContext}] {Site}: {Message}{NewLine}"
}
}
]
}
SerilogMiddleware.cs
public class SerilogAddUserInfo
{
private readonly RequestDelegate _next;
public SerilogAddUserInfo(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
using (LogContext.PushProperty("Address", context.Connection.RemoteIpAddress))
using (LogContext.PushProperty("Session", context.Session.GetString("SessionGUID") ?? "Unknown"))
{
await _next.Invoke(context);
}
}
}
В промежуточном программном обеспечении я хочу перенести некоторые свойства (адрес, сеанс и многое другое) в журналы. Когда я настраиваю Serilog, как написано выше, свойства не отображаются в журналах. Когда я настраиваю Serilog, используя следующий фрагмент в Program.cs, это действительно работает:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.MinimumLevel.Override("System", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Hour,outputTemplate: "{Timestamp:o} [{Level:u3}] [IP {Address}] [Session {Session}] [{SourceContext}] {Site}: {Message}{NewLine}")
.CreateLogger();
В чем разница? Или как я могу использовать возможности PushProperty в-appsettings-configured-serilog через-настроенный-serilog?
Ответ №1:
Вам нужно добавить только .Enrich.FromLogContext()
при инициализации Serilog в Program.cs
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.Enrich.FromLogContext()
.CreateLogger();
Проверьте встроенную инициализацию в Serilog.Документация AspNetCore.
Комментарии:
1. Спасибо, этого не хватало!
2. Вы хотите сказать, что добавление расширителя «FromLogContext» в конфигурационный файл не работает?