Выражение фильтра Serilog не работает для исключения заданных журналов конечной точки - PullRequest
0 голосов
/ 22 февраля 2020

В моем проекте .NetCore (2.2) WebAPI есть конечная точка проверки работоспособности, для которой я не хочу создавать и записывать какие-либо журналы. Я пишу логи в WindowsEventLog. Для этого я использую отдельный файл конфигурации только для целей ведения журнала, который я загружаю при запуске.

Это конечная точка, которая находится в контроллере для проверки работоспособности:

[Route("healthcheck")] 
[AllowAnonymous]
public IActionResult Get()
{
    return Ok("");
}

Вот так я загружаю файл конфигурации (SeriLogSettings. json), который я создал для хранения своей конфигурации Serilog:

 public Startup(IConfiguration configuration, IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
               .SetBasePath(env.ContentRootPath)
               .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
               .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
               .AddJsonFile("SeriLogSettings.json", optional: false)
               .AddEnvironmentVariables();

            Configuration = builder.Build();
        }

И вот так выглядит мой SerilogSettings. json например:

{
  "Serilog": {
    "Using": [ "Serilog.Settings.Configuration", "Serilog.Sinks.EventLog" ],
    "Filter": [
      {
        "Name": "ByExcluding",
        "Args": {
          "expression": "EndsWith(RequestPath, '%/healthcheck')"
        }
      }
    ],
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "Enrich": [ "FromLogContext" ],
    "WriteTo": [
      {
        "Name": "EventLog",
        "Args": {
          "source": "WebAPI", 
          "logName": "Application",
          "managedEventSource": true
        }
      }
    ],
    "Properties": {
      "Application": "ApplicationAPI"
    }
  }
}

Несмотря на использование выражения ByExclude для исключения журналов для конечной точки / healthcheck, я получаю журналы в WindowsEventLog. Я не могу понять, почему это происходит, и не уверен, что я делаю не так?

1 Ответ

0 голосов
/ 22 февраля 2020

Проблема в том, что в пути, который вы проверяете, находится символ %, он должен быть /healthcheck.

"expression": "EndsWith(RequestPath, '/healthcheck')"

Если вы посмотрите на документацию на странице GitHub вы также увидите, что при проверке пути запроса они просто упоминают /SomeEndpoint.

...