如何使用语义日志记录应用程序块 (SLAB) 在 C# 中基于级别配置多个接收器(进程内)

How to use Semantic Logging Application Block (SLAB) to configure multiple sinks based on level in C# (in-process)

当设置语义日志记录应用程序块 (SLAB) 以使用多个接收器(例如平面文件和滚动文件)时,它不会根据我的逻辑中的级别写入每个接收器;我试图理解为什么。我可以让它根据关键字而不是基于 EventLevel 写入不同的接收器。

我希望一个接收器获取所有日志,另一个接收器仅获取警告级别(或最差级别)的日志。当我定义 2 个侦听器时,一个级别为 "EventLevel.LogAlways" 的接收器和另一个级别为 "EventLevel.Warning" 的接收器时,我没有收到任何日志记录条目。 (我用 Verbose 的 EventLevel 定义了一个 EventSource 方法,并期望看到来自用 EventLevel.LogAlways 定义的侦听器的日志记录)

下面是我正在尝试实现的逻辑(如果这不够逻辑,请告诉我,我会相应地进行更新):

1) 下面以 aExpense 为例,我的 Application_Start:

中的监听器是这样定义的
//Log to file with EventLevel of at least Warning 
this.fileListener = FlatFileLog.CreateListener("aExpense.DataAccess.log", formatter: new XmlEventTextFormatter(EventTextFormatting.Indented), isAsync: true);
fileListener.EnableEvents(AExpenseEvents.Log, EventLevel.Warning, Keywords.All);

//Log to Rolling file with any EventLevel
this.rollingfileListener = RollingFlatFileLog.CreateListener("aExpense.UserInterface.log", rollSizeKB: 10, timestampPattern: "yyyy", rollFileExistsBehavior: RollFileExistsBehavior.Increment, rollInterval: RollInterval.Day, formatter: new JsonEventTextFormatter(EventTextFormatting.Indented), isAsync: true);
rollingfileListener.EnableEvents(AExpenseEvents.Log, EventLevel.LogAlways, Keywords.All);    

2)写日志是这样的:

//Log the event for application starting using Symmantic Logging (in-process)
AExpenseEvents.Log.ApplicationStarting();

3) ApplicationStarting() 的 AExpenseEvents (EventSource) 方法是:

[Event(100, Level = EventLevel.Verbose, Keywords = Keywords.Application, Task = Tasks.Initialize, Opcode = Opcodes.Starting, Version = 1)]
public void ApplicationStarting()
{

    if (this.IsEnabled(EventLevel.Verbose, Keywords.Application))
    {
        this.WriteEvent(100);
    }
}

我做了类似的实现,只是做了一点小改动。您可以按如下方式更改实现。 public 方法 ApplicationStarting 检查是否启用了日志记录。它用 [NoEvent] 装饰,表示 SLAB 在调用方法时不生成事件。如果启用了日志记录,那么将调用私有方法来写入事件。

    [NonEvent]
    public void ApplicationStarting()
    {
        if (this.IsEnabled(EventLevel.Verbose, Keywords.Application))
        {
            this.ApplicationStartingImplementation();
        }
    }

    [Event(100, Level = EventLevel.Verbose, Keywords = Keywords.Application, Task = Tasks.Initialize, Opcode = Opcodes.Starting, Version = 1)]
    private void ApplicationStartingImplementation()
    {
        this.WriteEvent(100);
    }

在调用 this.WriteEvent 之前删除 if 语句(检查特定 EventLevel 或关键字是否已启用)实现了我的目标;我现在有多个接收器监听不同的 EventLevel。

在我上面的原始问题中,数字 1 和 2 将保持不变,#3 将如下所示:

3) ApplicationStarting() 的 AExpenseEvents (EventSource) 方法是:

[Event(100, Level = EventLevel.Verbose, Keywords = Keywords.Application, Task = Tasks.Initialize, Opcode = Opcodes.Starting, Version = 1)]
public void ApplicationStarting()
{
    this.WriteEvent(100);
}