You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Serilog:全局Log与Log.Logger日志方法的差异及语法选择疑问

Serilog全局Log类与Logger实例的语法差异疑问

我想了解使用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为可空类型(string?),而全局Log.Debug方法的propertyValues参数是params object[],不允许传入null值。
  • 第二个Log.Logger.Debug调用则不会产生该警告,因为它的propertyValues参数定义为params object?[],明确允许空引用传入。

这让我更倾向于使用Log.Logger的调用方式而非全局Log类。我想确认:

  1. 这种参数类型的差异是Serilog的有意设计,还是库的疏漏或错误?
  2. 两种调用方式在运行时表现一致的前提下,哪种方式更推荐使用?

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:15:32