如何在本地显式使用Serilog默认控制台格式化器
问题描述
我们在K8s微服务架构中,于appsettings.json中使用以下Serilog配置:
{ "Serilog": { "Using": [ "Serilog.Sinks.Console" ], "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "Information", "Microsoft.Hosting.Lifetime": "Information" } }, "Enrich": [ "FromLogContext", "WithElasticApmCorrelationInfo" ], "WriteTo": [ { "Name": "Console", "Args": { "formatter": "Serilog.Formatting.Elasticsearch.ElasticsearchJsonFormatter, Serilog.Formatting.Elasticsearch" } } ] } }
当前配置的格式化器专为Elasticsearch设计,输出JSON格式日志,本地运行时阅读体验极差。希望通过appsettings.Development.json(或环境变量)切换为Serilog默认的控制台格式化器。
尝试了以下配置:
{ "Name": "Console", "Args": { "formatter": "Serilog.Sinks.SystemConsole.Output.OutputTemplateRenderer, Serilog.Sinks.Console" } }
但运行时抛出异常:
A default constructor was not found on Serilog.Sinks.SystemConsole.Output.OutputTemplateRenderer. at Serilog.Settings.Configuration.StringArgumentValue.ConvertTo(Type toType, ResolutionContext resolutionContext) at Serilog.Settings.Configuration.ConfigurationReader.<>c__DisplayClass21_2.<CallConfigurationMethods>b__3(<>f__AnonymousType9`2 <>h__TransparentIdentifier0) at System.Linq.Utilities.<>c__DisplayClass2_0`3.<CombineSelectors>b__0(TSource x) at System.Linq.Enumerable.SelectListPartitionIterator`2.ToList() at Serilog.Settings.Configuration.ConfigurationReader.CallConfigurationMethods(ILookup`2 methods, IReadOnlyCollection`1 configurationMethods, Object receiver) at Serilog.Settings.Configuration.ConfigurationReader.Configure(LoggerConfiguration loggerConfiguration) at Serilog.Configuration.LoggerSettingsConfiguration.Settings(ILoggerSettings settings)
请问如何在本地正确配置Serilog默认的控制台格式化器?
解决方案
方法1:直接移除formatter配置(最简方案)
Serilog控制台Sink默认会自动使用内置的人类可读格式化器,无需手动指定。在appsettings.Development.json中覆盖WriteTo节点,去掉formatter参数即可:
{ "Serilog": { "WriteTo": [ { "Name": "Console" } ] } }
本地运行时会自动切换为默认的易读文本格式输出日志。
方法2:指定正确的默认格式化器类型
你之前尝试的OutputTemplateRenderer并非可通过配置文件实例化的类型,它没有无参构造函数,因此抛出异常。正确的默认文本格式化器是Serilog.Formatting.Display.MessageTemplateTextFormatter,支持无参构造,也可自定义输出模板:
{ "Name": "Console", "Args": { "formatter": "Serilog.Formatting.Display.MessageTemplateTextFormatter, Serilog", "formatterArgs": { "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}" } } }
如果不指定outputTemplate,会使用Serilog内置的默认模板输出。
方法3:通过环境变量动态切换
若需在本地开发时通过环境变量快速切换,可在appsettings.json保留基础配置,然后设置环境变量:
Serilog__WriteTo__0__Args__formatter=Serilog.Formatting.Display.MessageTemplateTextFormatter, Serilog
或者直接清空格式化器参数,让默认逻辑生效。
内容的提问来源于stack exchange,提问作者kipusoep
相关产品推荐
相关产品推荐

