gpt4 book ai didi

c# - 一个带有 Serilog 的记录器的多个过滤器

转载 作者:太空狗 更新时间:2023-10-29 17:45:48 28 4
gpt4 key购买 nike

我正在尝试使用我的 ASP.NET Core 应用程序设置 Serilog。我想要一个日志文件用于所有 Controller ,一个用于所有服务,一个用于其余,最好是一个包含所有内容的日志文件。每个 Controller 都继承 BaseController 和每个服务 BaseService。我调用的 Controller 和服务正在写入跟踪日志事件。

记录器和服务通过依赖注入(inject)检索。该服务看起来像 Controller (关于记录器)。

public class UsersController: BaseController
{
private UserService service { get; }

public UsersController(ILogger<UsersController> logger, UserService userService) : base(logger)
{
service = userService;
}
}

public abstract class BaseController: Controller
{
protected readonly ILogger<BaseController> Logger;

public BaseController(ILogger<BaseController> 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<BaseController>())
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-controller-{Date}.log"))
.WriteTo.Logger(l3 => l3
.Filter.ByIncludingOnly(Matching.FromSource<BaseService>())
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-service-{Date}.log"))
.WriteTo.Logger(l3 => l3
.Filter.ByExcluding(Matching.FromSource<BaseController>())
.Filter.ByExcluding(Matching.FromSource<BaseService>())
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-other-{Date}.log"))
)

.WriteTo.RollingFile("d:/logs/recon-api-all-{Date}.log"))
.CreateLogger();

这仅为“其他”和“所有”创建日志文件。两者都包含来自 Controller 和服务的日志事件。

方法 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<BaseController>())
.Filter.ByIncludingOnly(Matching.FromSource<PrivilegeGroupsController>())
.Filter.ByIncludingOnly(Matching.FromSource<PrivilegesController>())
.Filter.ByIncludingOnly(Matching.FromSource<UsersController>())
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-controller-{Date}.log"))
.WriteTo.Logger(l3 => l3
.Filter.ByIncludingOnly(Matching.FromSource<BaseService>())
.Filter.ByIncludingOnly(Matching.FromSource<PrivilegeGroupService>())
.Filter.ByIncludingOnly(Matching.FromSource<PrivilegeService>())
.Filter.ByIncludingOnly(Matching.FromSource<UserService>())
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-service-{Date}.log"))
.WriteTo.Logger(l3 => l3
.Filter.ByExcluding(Matching.FromSource<BaseController>())
.Filter.ByExcluding(Matching.FromSource<UsersController>())
.Filter.ByExcluding(Matching.FromSource<PrivilegeGroupsController>())
.Filter.ByExcluding(Matching.FromSource<PrivilegesController>())
.Filter.ByExcluding(Matching.FromSource<BaseService>())
.Filter.ByExcluding(Matching.FromSource<UserService>())
.Filter.ByExcluding(Matching.FromSource<PrivilegeGroupService>())
.Filter.ByExcluding(Matching.FromSource<PrivilegeService>())
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-other-{Date}.log"))
)

.WriteTo.RollingFile("d:/logs/recon-api-all-{Date}.log"))
.CreateLogger();

这仅为“其他”和“所有”创建日志文件。 “all”包含来自 Controller 和服务的日志事件。

方法 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<UsersController>())
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-controller-{Date}.log"))
.WriteTo.Logger(l3 => l3
.Filter.ByIncludingOnly(Matching.FromSource<UserService>())
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-service-{Date}.log"))
.WriteTo.Logger(l3 => l3
.Filter.ByExcluding(Matching.FromSource<UsersController>())
.Filter.ByExcluding(Matching.FromSource<UserService>())
.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();

如果 Controller 和服务无法通过命名空间识别,您可以编写一个 lambda 函数来代替 isControllerisService 来识别它们。

(您的场景可能更适合允许更轻松过滤的日志记录格式,以便您可以通过事后过滤来选择性地查看 Controller 事件、服务事件等。查看其他 Serilog provided sinks 用于某些选项。)

关于c# - 一个带有 Serilog 的记录器的多个过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38760381/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com