Я пытаюсь реализовать фильтр журналов, используя выражения serilog в настройках моего приложения, фильтруя все журналы, связанные со здоровьем. Это моя конфигурация на данный момент:
"Serilog": {
"Using": [ "Serilog.Sinks.MSSqlServer" ],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "MSSqlServer",
"Args": {
"connectionString": "Data Source=XXX; Database=YYY; Integrated Security=True; TrustServerCertificate=true;",
"sinkOptionsSection": {
"tableName": "Logging",
"autoCreateSqlDatabase": false,
"autoCreateSqlTable": true
},
"columnOptionsSection": {
"additionalColumns": [
{
"columnName": "RequestMethod",
"dataLength": "8"
},
{
"columnName": "StatusCode",
"dataType": "Int"
}
]
},
"Filter": [
{
"Name": "ByExcluding",
"Args": {
"expression": "RequestPath like '%/health%'"
}
}
]
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
"Destructure": [
{
"Name": "ToMaximumDepth",
"Args": { "maximumDestructuringDepth": 4 }
},
{
"Name": "ToMaximumStringLength",
"Args": { "maximumStringLength": 100 }
},
{
"Name": "ToMaximumCollectionCount",
"Args": { "maximumCollectionCount": 10 }
}
],
"Properties": {
"Application": "Api"
}
},
Однако сообщения, связанные с HealthChecks, продолжают регистрироваться в моей базе данных.
Как я могу написать конфигурацию, которая фильтрует IncludeOnly, Exclude или проверяет, имеет ли столбец из таблицы Loggin определенное значение?
Спасибо
Я прочитал документациюо выражениях Serilog, но не совсем понял, как работает фильтр: Какие свойства я могу использовать для фильтрации? Где я могу их найти? Являются ли это переменными в {KEYS} из столбца MessageTemplate? А как насчет моих специальных столбцов: могу ли я их фильтровать?
Пример: сообщение в MessageTemplate "HTTP {RequestMethod} {RequestPath} ответило {StatusCode} через {Elapsed:0.0000} мс" предоставляет мне переменную {RequestPath}, но когда я пытаюсь использовать ее в фильтре ("expression": " RequestPath, например '%/health%'"), ничего не происходит.





Раздел «Фильтр» находился не в том месте, внутри тега WriteTo. Размещение его прямо внутри «Serilog» устранило проблему.
"Serilog": {
"Using": [ "Serilog.Sinks.MSSqlServer" ],
"MinimumLevel": "Information",
"WriteTo": [
{
"Name": "MSSqlServer",
"Args": {
"connectionString": "Data Source=XXX; Database=YYY; Integrated Security=True; TrustServerCertificate=true;",
"sinkOptionsSection": {
"tableName": "Logging",
"autoCreateSqlDatabase": false,
"autoCreateSqlTable": true
},
"columnOptionsSection": {
"additionalColumns": [
{
"columnName": "RequestMethod",
"dataType": "nvarchar",
"dataLength": "8"
},
{
"columnName": "StatusCode",
"dataType": "Int"
},
{
"columnName": "MachineName",
"dataType": "nvarchar",
"dataLength": "32"
},
{
"columnName": "EnvironmentName",
"dataType": "nvarchar",
"dataLenght": "32"
},
{
"columnName": "EnvironmentUserName",
"dataType": "nvarchar",
"dataLenght": "32"
},
{
"columnName": "ClientIp",
"dataType": "nvarchar",
"dataLenght": "64"
},
{
"columnName": "ThreadId",
"dataType": "int"
},
{
"columnName": "ThreadName",
"dataType": "nvarchar",
"dataLenght": "32"
},
{
"columnName": "ProcessId",
"dataType": "int"
},
{
"columnName": "ProcessName",
"dataType": "nvarchar",
"dataLenght": "64"
}
]
}
}
}
],
"Filter": [
{
"Name": "ByExcluding",
"Args": {
"expression": "Contains(@m, 'health')"
}
},
{
"Name": "ByExcluding",
"Args": {
"expression": "Contains(@m, 'Health_Homol')"
}
},
{
"Name": "ByExcluding",
"Args": {
"expression": "Contains(@m, 'swagger')"
}
}
],
"Enrich": [
"FromLogContext",
"WithMachineName",
"WithEnvironmentName",
"WithEnvironmentUserName",
"WithThreadId",
"WithThreadName",
"WithClientIp",
"WithProcessId",
"WithProcessName"
],
"Properties": {
"Application": "Api"
}