我想通过编译时安全检查来增强我的记录器,以防止我记录个人识别或敏感数据。这是我想象的界面可能的样子:
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
,roleId
等password
。其中一些字段非常适合记录,例如id
和roleId
。那些不安全的日志将被标记为[PersonallyIdentifying]
或之类的属性[Secret]
。
我想要一个这样的类型SafeToLog<T>
,它对 T 的每个安全记录属性都有方法,但对不安全记录属性没有方法。所以SafeToLog<User>
应该有属性id
,createdAt
和roleId
。它不应该有属性firstname
,lastname
或password
。
是否可以实现该SafeToLog
类型?在 Typescript 中,我可以使用Omit
辅助类型来构造它,但我不知道如何在 C# 中做到这一点。
此外,是否可以防止记录器的意外误用?在上面的示例中,粗心的开发人员仍然可以user
在日志字符串中引用,忽略safeuser
并绕过安全检查。我可以以某种方式强制在日志消息中仅引用 lambda 中提供的变量吗?