c# - 记录可能为空参数时 Log.Information 和 Log.Logger.Information 之间的 Serilog 差异

标签 c# serilog

我想知道使用 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.Debug method

Log.Logger.Debug 调用不会给我此编译器警告,因为它具有不同的签名:

Log.Logger.Debug method

这让我想使用第二种方法,而不是全局 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/

相关文章:

c# - 完成测试后如何追踪仍在工作的线程?

c# - 为 Amazon OpenSearch 设置 Serilog

serilog - 使用 RestrictedToMinimumLevel 覆盖 Serilog 中的默认最低级别

c# - 如何将 User Agent 和 Referer 记录到 Serilog?

c# - 如何替换 MeshRenderer.sharedMaterials 中的元素

c# - 如何将搜索词解析为各种问题类型?

c# - 如何从 .wav 声音进入双 [] C#

c# - Serilog 不会在 MongoDB 上写入,也不会抛出任何错误

xamarin - 将 Serilog 与 MvvmCross 结合使用

c# - 在 .NET Core 5 中工作时,使用 Serilog 进行日志记录不会使用 'Serilog.Sinks.File' 选项在 .NET Core 6 中创建日志