Múltiples filtros para un logger con Serilog

Estoy intentando configurar Serilog con mi aplicación ASP.NET Core. Me gustaría tener un archivo de registro para todos los controladores, uno para todos los servicios, uno para el rest e idealmente uno que contenga todo. Cada controlador está heredando BaseController y cada servicio BaseService . El controlador y el servicio al que estoy llamando están escribiendo un evento de registro de seguimiento.

El registrador y el servicio se recuperan mediante inyección dependiente. El servicio se parece al controlador (en relación con el registrador).

 public class UsersController: BaseController { private UserService service { get; } public UsersController(ILogger logger, UserService userService) : base(logger) { service = userService; } } public abstract class BaseController: Controller { protected readonly ILogger Logger; public BaseController(ILogger logger) { Logger = logger; } } 

Enfoque 1 (trabajando solo con las clases base)

 Log.Logger = new LoggerConfiguration() .MinimumLevel.Verbose() .WriteTo.Logger(l => l .MinimumLevel.Verbose() .WriteTo.Logger(l2 => l2 .WriteTo.Logger(l3 => l3 .Filter.ByIncludingOnly(Matching.FromSource()) .MinimumLevel.Verbose() .WriteTo.RollingFile("d:/logs/recon-api-controller-{Date}.log")) .WriteTo.Logger(l3 => l3 .Filter.ByIncludingOnly(Matching.FromSource()) .MinimumLevel.Verbose() .WriteTo.RollingFile("d:/logs/recon-api-service-{Date}.log")) .WriteTo.Logger(l3 => l3 .Filter.ByExcluding(Matching.FromSource()) .Filter.ByExcluding(Matching.FromSource()) .MinimumLevel.Verbose() .WriteTo.RollingFile("d:/logs/recon-api-other-{Date}.log")) ) .WriteTo.RollingFile("d:/logs/recon-api-all-{Date}.log")) .CreateLogger(); 

Esto crea los archivos de registro para “otros” y “todos” solamente. Ambos contienen los eventos de registro desde el controlador y el servicio.

Enfoque 2 (trabajando con las clases concretas)

 Log.Logger = new LoggerConfiguration() .MinimumLevel.Verbose() .WriteTo.Logger(l => l .MinimumLevel.Verbose() .WriteTo.Logger(l2 => l2 .WriteTo.Logger(l3 => l3 .Filter.ByIncludingOnly(Matching.FromSource()) .Filter.ByIncludingOnly(Matching.FromSource()) .Filter.ByIncludingOnly(Matching.FromSource()) .Filter.ByIncludingOnly(Matching.FromSource()) .MinimumLevel.Verbose() .WriteTo.RollingFile("d:/logs/recon-api-controller-{Date}.log")) .WriteTo.Logger(l3 => l3 .Filter.ByIncludingOnly(Matching.FromSource()) .Filter.ByIncludingOnly(Matching.FromSource()) .Filter.ByIncludingOnly(Matching.FromSource()) .Filter.ByIncludingOnly(Matching.FromSource()) .MinimumLevel.Verbose() .WriteTo.RollingFile("d:/logs/recon-api-service-{Date}.log")) .WriteTo.Logger(l3 => l3 .Filter.ByExcluding(Matching.FromSource()) .Filter.ByExcluding(Matching.FromSource()) .Filter.ByExcluding(Matching.FromSource()) .Filter.ByExcluding(Matching.FromSource()) .Filter.ByExcluding(Matching.FromSource()) .Filter.ByExcluding(Matching.FromSource()) .Filter.ByExcluding(Matching.FromSource()) .Filter.ByExcluding(Matching.FromSource()) .MinimumLevel.Verbose() .WriteTo.RollingFile("d:/logs/recon-api-other-{Date}.log")) ) .WriteTo.RollingFile("d:/logs/recon-api-all-{Date}.log")) .CreateLogger(); 

Esto crea los archivos de registro para “otros” y “todos” solamente. “all” contiene los eventos de registro del controlador y del servicio.

Enfoque 3 (trabajando solo con las clases de usuario)

 Log.Logger = new LoggerConfiguration() .MinimumLevel.Verbose() .WriteTo.Logger(l => l .MinimumLevel.Verbose() .WriteTo.Logger(l2 => l2 .WriteTo.Logger(l3 => l3 .Filter.ByIncludingOnly(Matching.FromSource()) .MinimumLevel.Verbose() .WriteTo.RollingFile("d:/logs/recon-api-controller-{Date}.log")) .WriteTo.Logger(l3 => l3 .Filter.ByIncludingOnly(Matching.FromSource()) .MinimumLevel.Verbose() .WriteTo.RollingFile("d:/logs/recon-api-service-{Date}.log")) .WriteTo.Logger(l3 => l3 .Filter.ByExcluding(Matching.FromSource()) .Filter.ByExcluding(Matching.FromSource()) .MinimumLevel.Verbose() .WriteTo.RollingFile("d:/logs/recon-api-other-{Date}.log")) ) .WriteTo.RollingFile("d:/logs/recon-api-all-{Date}.log")) .CreateLogger(); 

Esto crea todos los archivos de registro y cada archivo contiene los mensajes esperados.

Qué se necesita hacer para lograr el objective deseado (vea la segunda oración de este post).

Saludos cordiales, Carsten

    Serilog también hará esto como usted describe, al filtrar por espacio de nombres:

     var isController = Matching.FromSource("MyApp.Controllers"); var isService = Matching.FromSource("MyApp.Services"); Log.Logger = new LoggerConfiguration() .MinimumLevel.Verbose() .WriteTo.RollingFile("d:/logs/recon-api-all-{Date}.log") .WriteTo.Logger(l => l .Filter.ByIncludingOnly(isController) .WriteTo.RollingFile("d:/logs/recon-api-controller-{Date}.log")) .WriteTo.Logger(l => l .Filter.ByIncludingOnly(isService) .WriteTo.RollingFile("d:/logs/recon-api-service-{Date}.log")) .WriteTo.Logger(l => l .Filter.ByExcluding(e => isController(e) || iService(e)) .WriteTo.RollingFile("d:/logs/recon-api-other-{Date}.log")) .CreateLogger(); 

    Si los controladores y servicios no son identificables por espacio de nombres, puede escribir una función lambda en lugar de isController o isService para identificarlos.

    (Su escenario podría ser más adecuado para un formato de registro que permita un filtrado más fácil, de modo que pueda ver selectivamente los eventos del controlador, los eventos de servicio y demás, filtrando después del hecho. Consulte los otros sumideros provistos por Serilog para conocer algunas opciones).