在 serilog 日志中使用常见的 属性
Using a common property in serilog Logs
我目前正在尝试了解结构化日志记录的序列日志。
有没有办法强制在 serilog 中使用 common 属性 。就像我用下面的代码写的日志一样
log.Info("Disk Quota {DiskQuota} exceeded by user {Username}", 100, "User1")
我如何使用消息模板来确保在 2 到 3 类 中写入的任何未来日志可能会抛出超过警告的磁盘配额并且需要记录,始终仅使用 {Username} 而不是 { user} 或 {userid} 等
log.Info("Disk Quota {DiskQuota} exceeded by user {User}", 100, "User2") // Disallow , Possibly ??
Serilog 中没有任何开箱即用的东西可以为您做到这一点。
一个好的解决方案是实现您自己的 source code analyzer,它可以在构建期间执行这些检查并在消息相似但有不同 属性 时发出警告 and/or 错误] 名字。
你必须定义一个你可以使用的String metric to decide what "similar" means to you. There are a number of String metrics,它们每个都很相似但有一些不同的特点,流行的是:
- Levenshtein Distance:将一个单词更改为另一个单词所需的最小单字符编辑次数。字符串的长度不必相同;
- Hamming Distance:两个等长字符串中不同的字符数;
- Smith–Waterman:计算变量子序列相似度的算法族;
- Sørensen–Dice Coefficient:一种计算相邻字符对差异系数的相似度算法。
您还利用 SerilogAnalyzer 项目的部分源代码在代码中查找消息模板,并执行检查。
一个更简单的解决方案(但不是那么有效,因为依赖于良好的开发人员行为)是在 class 中声明这些标准消息模板,在您的解决方案中共享的项目中,因此您可以在任何地方引用它们而不是键入。
例如
public static class LogMessageTemplates
{
public const string DiskQuotaExceededByUsername = "Disk Quota {DiskQuota} exceeded by user {Username}";
}
然后在任何地方您都需要开发人员始终使用这些预定义的消息模板,而不是直接键入字符串。例如:
log.Info(LogMessageTemplates.DiskQuotaExceededByUsername, 100, "User1");
如果您使用这种方法,您可能需要在项目中安装 SerilogAnalyzer 以帮助您识别消息模板具有 X
参数但您正在使用 Y
的位置鉴于现在更难仅通过查看名称来确定消息模板具有多少属性。
我目前正在尝试了解结构化日志记录的序列日志。 有没有办法强制在 serilog 中使用 common 属性 。就像我用下面的代码写的日志一样
log.Info("Disk Quota {DiskQuota} exceeded by user {Username}", 100, "User1")
我如何使用消息模板来确保在 2 到 3 类 中写入的任何未来日志可能会抛出超过警告的磁盘配额并且需要记录,始终仅使用 {Username} 而不是 { user} 或 {userid} 等
log.Info("Disk Quota {DiskQuota} exceeded by user {User}", 100, "User2") // Disallow , Possibly ??
Serilog 中没有任何开箱即用的东西可以为您做到这一点。
一个好的解决方案是实现您自己的 source code analyzer,它可以在构建期间执行这些检查并在消息相似但有不同 属性 时发出警告 and/or 错误] 名字。
你必须定义一个你可以使用的String metric to decide what "similar" means to you. There are a number of String metrics,它们每个都很相似但有一些不同的特点,流行的是:
- Levenshtein Distance:将一个单词更改为另一个单词所需的最小单字符编辑次数。字符串的长度不必相同;
- Hamming Distance:两个等长字符串中不同的字符数;
- Smith–Waterman:计算变量子序列相似度的算法族;
- Sørensen–Dice Coefficient:一种计算相邻字符对差异系数的相似度算法。
您还利用 SerilogAnalyzer 项目的部分源代码在代码中查找消息模板,并执行检查。
一个更简单的解决方案(但不是那么有效,因为依赖于良好的开发人员行为)是在 class 中声明这些标准消息模板,在您的解决方案中共享的项目中,因此您可以在任何地方引用它们而不是键入。
例如
public static class LogMessageTemplates
{
public const string DiskQuotaExceededByUsername = "Disk Quota {DiskQuota} exceeded by user {Username}";
}
然后在任何地方您都需要开发人员始终使用这些预定义的消息模板,而不是直接键入字符串。例如:
log.Info(LogMessageTemplates.DiskQuotaExceededByUsername, 100, "User1");
如果您使用这种方法,您可能需要在项目中安装 SerilogAnalyzer 以帮助您识别消息模板具有 X
参数但您正在使用 Y
的位置鉴于现在更难仅通过查看名称来确定消息模板具有多少属性。