Al fin después de mucho luchar ya hallamos la respuesta de este contratiempo que muchos lectores de nuestra web han tenido. Si deseas compartir algún detalle no dudes en aportar tu información.
Solución:
Puede hacer esto asegurándose primero de que los eventos del contador de rendimiento estén etiquetados con un valor de propiedad particular (OpenMappedContext()
en LibLog) o de un tipo/espacio de nombres en particular.
var log = LogProvider.For()
log.Info(...);
Al configurar Serilog, un registrador secundario con filtro aplicado puede enviar solo los eventos requeridos al segundo archivo.
Log.Logger = new LoggerConfiguration()
.WriteTo.Logger(lc => lc
.Filter.ByExcluding(Matching.FromSource("MyApp.Performance"))
.WriteTo.File("first.json", new JsonFormatter()))
.WriteTo.Logger(lc => lc
.Filter.ByIncludingOnly(Matching.FromSource("MyApp.Performance"))
.WriteTo.File("second.json", new JsonFormatter()))
.CreateLogger();
También podemos configurarlo en los archivos de configuración. A continuación se muestra una muestra en el appsettings.json
para dividir el registro de los archivos rodantes en función de los niveles
"Serilog":
"MinimumLevel":
"Default": "Debug",
"Override":
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
,
"WriteTo": [
"Name": "Logger",
"Args":
"configureLogger":
"Filter": [
"Name": "ByIncludingOnly",
"Args":
"expression": "(@Level = 'Error' or @Level = 'Fatal' or @Level = 'Warning')"
],
"WriteTo": [
"Name": "File",
"Args":
"path": "Logs/ex_.log",
"outputTemplate": "Timestamp:o [Level:u3] (SourceContext) MessageNewLineException",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
]
,
"Name": "Logger",
"Args":
"configureLogger":
"Filter": [
"Name": "ByIncludingOnly",
"Args":
"expression": "(@Level = 'Information' or @Level = 'Debug')"
],
"WriteTo": [
"Name": "File",
"Args":
"path": "Logs/cp_.log",
"outputTemplate": "Timestamp:o [Level:u3] (SourceContext) MessageNewLineException",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
]
],
"Enrich": [
"FromLogContext",
"WithMachineName"
],
"Properties":
"Application": "MultipleLogFilesSample"
Luego, solo necesitarás modificar el CreateHostBuilder
método en Program.cs
archivo para leerlo desde el archivo de configuración
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
webBuilder.UseStartup();
)
.UseSerilog((hostingContext, loggerConfig) =>
loggerConfig.ReadFrom.Configuration(hostingContext.Configuration)
);
Para más detalles, consulte la publicación aquí
Si desea tener una canalización de registro independiente, simplemente cree otra instancia. Esto está robado y adaptado de https://github.com/serilog/serilog/wiki/Lifecycle-of-Loggers:
using (var performanceCounters = new LoggerConfiguration()
.WriteTo.File(@"myapplog.txt")
.CreateLogger())
performanceCounters.Information("Performance is really good today ;-)");
// Your app runs, then disposal of `performanceCounters` flushes any buffers
Recuerda mostrar este enunciado si te valió la pena.