Serilog 格式化程序编辑

ITextFormatter 实现将 Serilog 事件格式化为符合 Elastic Common Schema 规范的 JSON 表示形式。

安装编辑

添加对 Elastic.CommonSchema.Serilog 包的引用

<PackageReference Include="Elastic.CommonSchema.Serilog" Version="8.6.0" />

用法编辑

var logger = new LoggerConfiguration()
    .WriteTo.Console(new EcsTextFormatter())
    .CreateLogger();

在上面的代码段中,new EcsTextFormatter() 启用文本格式化程序并指示 Serilog 将事件格式化为 JSON。上面的示例使用控制台接收器,但您可以随意使用任何您选择的接收器,也许可以考虑使用文件系统接收器和 Elastic Filebeat 来实现持久且可靠的摄取。

在 ASP.NET(核心)应用程序中

.UseSerilog((ctx, config) =>
{
	// Ensure HttpContextAccessor is accessible
	var httpAccessor = ctx.Configuration.Get<HttpContextAccessor>();

	config
		.ReadFrom.Configuration(ctx.Configuration)
		.Enrich.WithEcsHttpContext(httpAccessor)
		.WriteTo.Async(a => a.Console(new EcsTextFormatter()));
})

WithEcsHttpContext 确保日志将通过 HttpContext 数据进行丰富。

下面给出了输出示例

{
  "@timestamp": "2019-11-22T14:59:02.5903135+11:00",
  "log.level": "Information",
  "message": "Log message",
  "ecs": {
    "version": "1.4.0"
  },
  "event": {
    "severity": 0,
    "timezone": "AUS Eastern Standard Time",
    "created": "2019-11-22T14:59:02.5903135+11:00"
  },
  "log": {
    "logger": "Elastic.CommonSchema.Serilog"
  },
  "process": {
    "thread": {
      "id": 1
    },
    "executable": "System.Threading.ExecutionContext"
  }
}

配置编辑

选项 描述

MapCurrentThead

true 通过查找当前线程的 Process 来映射 ecs.process

MapHttpAdapter

null 一种将 HttpContextAccessor 映射到 ECS 字段的方法。

LogEventsPropertiesToFilter

一个 Set<string>,其中包含不应作为 labels.*metadata.* 发射的属性。

MapCustom

一个 Func,允许您在完全转换之前修改 EcsDocument。

ECS 敏感消息模板编辑

此格式化程序还允许您使用符合 https://messagetemplates.org/ 格式的属性从消息模板中直接设置 ECS 字段。

可用的 ECS 消息模板属性列在 LogTemplateProperties.* 下,例如 LogTemplateProperties.TraceId

Log.Information("The time is {TraceId}", "my-trace-id");

将覆盖生成的 ECS json 文档上的 trace.id