Контекст
Я нахожусь в процессе разработки функциональности регистрации приложения.
Ищу элегантное и хорошее решение с точки зрения производительности.
(и, конечно, я не будуповторно внедрить колесо :). Я буду использовать популярную библиотеку журналов - например, Nlog, Serilog ...).
Требование
Журнал объекты , которые могут содержать свойства с конфиденциальной информацией .
Предположим, что класс человека:
class Person {
string Name { get; set; }
string SensitiveInfo { get; set; }
}
Плохой (на мой взгляд) подход - это делать что-то вроде этого:
logger.Debug($"{person.Name}, {Hash(person.SenstiveInfo)}");
Почему я нахожу это плохим?
- Это журнал отладки, который (в зависимости от уровня ведения журнала) может никогда не регистрироваться. Следовательно, он тратит ресурсы ЦП на хеширование без какой-либо необходимости.
- Я бы предпочел, чтобы объект передавался как есть (например, logger.Debug (person)), а не заставлял разработчика ломаться вручнуювсе свойства объекта.
Пока мысли ...
Для обоих приведенных ниже подходов требуется loggerWrapper, которого - если возможно - я хочу избежать:
class LoggerWrapper {
LoggerWrapper (ILogger logger) {
//store the ILogger
}
void Log(object objectToBeLogged, LoggingLevel level) {
//If logging level is not accepted return
_logger.Log(objectToBeLogged, level);
}
}
1. Создание интерфейса ILoggable
interface ILoggable {
string GetLogValue(HashManager hashManager);
}
class Person: ILoggable {
string Name { get; set; }
string SensitiveInfo { get; set; }
string GetLogValue(HashManager hashManager) {
string hashedValue = hashManager.Hash(person.SenstiveInfo);
return $"{person.Name}, {hashedValue}"
}
}
// Now the LogWrapper.Log will expect an ILoggable, and will use the 'GetLogValue' method
// overriding 'ToString()' is an alternative but it is exposed by the 'object' class, and i fear that is not strict enough/can be forgotten.
Относится к этому подходу: слишком требовательно для разработчиков? Ремонтопригодность?
2. Аннотации и рефлексия
class Person {
[Loggable]
string Name { get; set; }
[Loggable, SensitiveInfo]
string SensitiveInfo { get; set; }
}
// Now the logWrapper will rely on reflection (i think) and choose what to log/hash
Озабоченность этим подходом: производительность?
Считаются ли вышеуказанные подходы плохой практикой? Есть ли лучший подход?
Есть ли библиотеки, которые уже занимаются этим?