我想知道使用 Serilog 时是否应该使用特定的语法。
文档几乎在每个示例中都显示了 Log.Debug([...])
。
但是,给出以下演示代码:
using Serilog;
internal record User(
string FirstName,
string? LastName,
string Email,
int Id,
int Age,
string NickName
);
public class Program
{
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.CreateLogger();
var user = new User("First", null, "", 1, 2, "Test");
Log.Debug("User: {firstName} {lastName} {email} {id} {age} {nickname}", user.FirstName, user.LastName, user.Email, user.Id, user.Age, user.NickName);
Log.Logger.Debug("User: {firstName} {lastName}", user.FirstName, user.LastName, user.Email, user.Id, user.Age, user.NickName);
}
}
我收到编译器警告(警告 CS8604:“void Log.Debug(string messageTemplate, params object[] propertyValues)”中参数“propertyValues”可能为空引用参数。
)第一个 Log.Debug
调用,因为 user.LastName
可能为 null。
Log.Debug
方法显示以下参数:
而 Log.Logger.Debug
调用不会给我此编译器警告,因为它具有不同的签名:
这让我想使用第二种方法,而不是全局 Log
类。
这种差异是故意的吗?我应该在 Log.Logger
设置上使用 Log
类,还是只是 Serilog 库中的一个疏忽/错误?
在运行时我没有注意到差异。
我使用了两种方法,一种给我编译器警告,另一种则没有。我不在乎是否必须使用 Log.Logger 来消除警告,但我只想确认其中一个并不比另一个更好。
最佳答案
latest source code使用相同的参数并且不会生成任何可空性警告:
[MessageTemplateFormatMethod("messageTemplate")]
public static void Debug(string messageTemplate, params object?[]? propertyValues)
{
Logger.Debug(messageTemplate, propertyValues);
}
Github 的 Blame 显示该行最后一次修改是在 2022 年 8 月。该修复应该包含在 2022 年 9 月发布的 Serilog 2.12 中
关于c# - 记录可能为空参数时 Log.Information 和 Log.Logger.Information 之间的 Serilog 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74488554/