Библиотека предназначена для маскирования какой-либо информации в логах, построенных на базе Serilog.
Построена на стандартном механизме Serilog, называемом Sinks.
- .NETStandard 2.0
- Serilog 2.5.0+
Подключите библиотеку через Avalab NuGet Repository "https://nuget.avalab.io/api/v2/", выполнив команду:
Install-Package -Source "https://nuget.avalab.io/api/v2/" Avalab.Serilog.Sanitizer
Т.к. библиотека является реализацией ILogEventSink
, то подключение осуществляется через
LoggerConfiguration().WriteTo
:
var logger = new LoggerConfiguration()
.WriteTo.Sanitizer(
r => { r.PanUnreadable(); r.CvvHidden(); },
s => { s.Debug(); s.Console(); }
).CreateLogger();
В качестве первого обязательного параметра rules
, необходимо передать коллекцию AbstractSanitizingRule[]
.
Это так называемые правила для транформации контента, маскировки текста логов.
В качестве второго обязательного параметра sinks
, необходимо передать коллекцию ILogEventSink[]
. Это целевые Sinks,
куда затем, после трансформации, отправяться логи, экземпляры LogEvent
.
Дополнительный, необязательный параметр sanitizeException
типа bool
, по умолчанию true
. Отчечает за то, чтобы библиотека
обрабатывала в том числе Exception
поле логов, LogEvent.Exception
.
Библиотека также включает в себя 3 реализации AbstractSanitizingRule
:
- PanUnreadable
- CvvHidden
- RegexHidden
Правило позволяет маскировать номера платежных, кредитных карт, путем замены части цифр на символ *
В качестве параметров, принимает:
string regularExpression = "[3456]\\d{3}[- ]?\\d{4}[- ]?\\d{4}[- ]?\\d{4}(?:[- ]?\\d{2})?"
string replaceString = "*"
uint startSkipCount = 6
uint endSkipCount = 4
, где:
regularExpression
- регулярное выражение для поиска кредитных карт;
replaceString
- символ для замены части цифр;
startSkipCount
- количество пропускаемых цифр в начале;
endSkipCount
- количество пропускаемых цифр в конце.
CvvHidden
Правило позволяет маскировать CVV коды кредитных карт, путем замены всех цифр на символ *
В качестве параметров, принимает:
string regularExpression = "(?i)cvv\"?[ ]?:[ ]?\"?\\d{3}\"?"
string replaceString = "*"
, где:
regularExpression
- регулярное выражение для поиска CVV кода кредитных карт;
replaceString
- символ или строка для замены всех цифр.
RegexHidden
Правило позволяет маскировать куски текста, найденные через регулярное выражение, на символ *
В качестве параметров, принимает:
string regularExpression
string replaceExpression
string replaceString = "*"
, где:
regularExpression
- обязательный. Регулярное выражение для поиска строк;
replaceExpression
- обязательный. Регулярное выражение для замены символов, в строках, найденных через первый папаметр;
replaceString
- символ или строка для замены.
Для начала необходимо подключить библиотеку через NuGet:
Install-Package Serilog.Settings.Configuration
, которая позволяет читать файлы appsettings.json и передавать конфигурацию через код:
var logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
, где configuration
реализует IConfiguration
Пример секции конфигурации:
"Serilog": {
"Using": [
"Serilog.Sinks.Trace",
"Serilog.Sinks.Debug",
"Avalab.Serilog.Sanitizer" // обязательно нужно подключить Assembly
],
...
"WriteTo": [
{
"Name": "Sanitizer",
"Args": {
"rules": [
{
"Name": "PanUnreadable",
"Args": {
"regularExpression": "[3456]\\d{3}[- ]?\\d{4}[- ]?\\d{4}[- ]?\\d{4}(?:[- ]?\\d{2})?",
"replaceString": "*"
}
},
{
"Name": "CvvHidden",
"Args": {
"regularExpression": "(?i)cvv\"?[ ]?:[ ]?\"?\\d{3}\"?",
"replaceString": "*"
}
}
],
"sinks": [
{
"Name": "Trace",
"Args": {
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}"
}
},
{
"Name": "Debug",
"Args": {
"outputTemplate": "[{Level}] {Message}{NewLine}{Exception}"
}
}
]
}
}
]
...
Библиотека поддерживает добавление собственных правил модификации.
Для этого необходимо реализовать AbstractSanitizingRule
, один единственный публичный метод Sanitize
:
sealed class MyCustomSanitizingRule : AbstractSanitizingRule
{
public MyCustomSanitizingRule(string param1, int param2)
{
// ...
}
public string Sanitize(string content)
{
// реализация: необходимо вернуть измененную строку
}
}
А также добавить метод расширения вида:
public static LoggerConfiguration MyCustomRule(
this LoggerSinkConfiguration loggerSinkConfiguration,
string param1 = "value1",
int param2 = 123)
{
if (loggerSinkConfiguration == null)
throw new ArgumentNullException(nameof(loggerSinkConfiguration));
return loggerSinkConfiguration.Sink(new MyCustomSanitizingRule(param1, param2));
}
После можно прописать правило в конфигурацию, не забыв указать Assembly, где лежит это правило:
"Using": [
"MyCustomRuleAssembly"
],
...
"rules": [
{
"Name": "MyCustomRule",
"Args": {
"param1": "value1",
"param2": 123
}
}
...