【问题标题】:Serilog difference between Log.Information and Log.Logger.Information when logging potentially null parameters记录可能为空的参数时 Log.Information 和 Log.Logger.Information 之间的 Serilog 区别
【发布时间】: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 来让警告消失,但我只想确认一个并不比另一个更好。

【问题讨论】:

标签: c# serilog


【解决方案1】:

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 中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 2019-07-21
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多