0

我想通过编译时安全检查来增强我的记录器,以防止我记录个人识别或敏感数据。这是我想象的界面可能的样子:

logger.LogInfo(safeuser => $"Logging out sensitive data @{safeuser.lastname}", user);
// Error: SafeToLog<User> does not contain a definition for 'lastname'

此行不应编译。

常规User类具有属性id, firstname, lastname, createdAt,roleIdpassword。其中一些字段非常适合记录,例如idroleId。那些不安全的日志将被标记为[PersonallyIdentifying]或之类的属性[Secret]

我想要一个这样的类型SafeToLog<T>,它对 T 的每个安全记录属性都有方法,但对不安全记录属性没有方法。所以SafeToLog<User>应该有属性id,createdAtroleId。它不应该有属性firstnamelastnamepassword

是否可以实现该SafeToLog类型?在 Typescript 中,我可以使用Omit辅助类型来构造它,但我不知道如何在 C# 中做到这一点。


此外,是否可以防止记录器的意外误用?在上面的示例中,粗心的开发人员仍然可以user在日志字符串中引用,忽略safeuser并绕过安全检查。我可以以某种方式强制在日志消息中仅引用 lambda 中提供的变量吗?

4

0 回答 0