使用Serilog的一个记录器的多个filter

我正在尝试使用我的ASP.NET核心应用程序设置Serilog。 我想为所有控制器提供一个日志文件,一个用于所有服务,一个用于其余服务,理想情况下包含一切。 每个控制器都inheritanceBaseController和每个服务BaseService 。 我正在调用的控制器和服务正在编写跟踪日志事件。

通过dependency injection检索记录器和服务。 该服务看起来像控制器(关于记录器)。

 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; } } 

方法1 (仅与基础部门合作)

 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(); 

这将仅为“其他”和“全部”创建日志文件。 两者都包含来自控制器和服务的日志事件。

方法2 (与具体课程一起工作)

 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(); 

这将仅为“其他”和“全部”创建日志文件。 “all”包含来自控制器和服务的日志事件。

方法3 (仅使用用户类)

 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(); 

这将创建所有日志文件,每个文件都包含预期的消息。

为实现预期目标需要做些什么(见本文第二句)。

最好的问候,卡斯滕

Serilog也会按照您描述的方式执行此操作,方法是按命名空间过滤:

 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(); 

如果命名空间无法识别控制器和服务,则可以编写lambda函数来代替isControllerisService来识别它们。

(您的场景可能更适合于允许更容易过滤的日志记录格式,因此您可以通过事后过滤来有选择地查看控制器事件,服务事件等等。请查看其他Serilog为某些选项提供的接收器。)