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类。我想确认:
- 这种参数类型的差异是Serilog的有意设计,还是库的疏漏或错误?
- 两种调用方式在运行时表现一致的前提下,哪种方式更推荐使用?
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

