【发布时间】:2022-11-18 18:59:28
【问题描述】:
我想知道在使用 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);
}
}
我收到第一个 Log.Debug 调用的编译器警告 (warning CS8604: Possible null reference argument for parameter 'propertyValues' in 'void Log.Debug(string messageTemplate, params object[] propertyValues)'.),因为 user.LastName 可能为空。
Log.Debug 方法显示以下参数:
而 Log.Logger.Debug 调用没有给我这个编译器警告,因为它有不同的签名:
这让我想使用第二种方法,而不是全局 Log 类。
这种差异是故意的,我应该在 Log.Logger 设置上使用 Log 类,还是仅仅是 Serilog 库中的疏忽/错误?
在运行时,我没有注意到有什么不同。
我已经使用了这两种方法,一种会给我编译器警告,另一种不会。我不在乎是否必须使用 Log.Logger 来让警告消失,但我只想确认一个并不比另一个更好。
【问题讨论】:
-
您使用的是哪个版本? The latest Log.Debug source code 使用
object?[]?