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

如何在本地显式使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:40:42