Serilog 格式化器

编辑

ITextFormatter 实现将 Serilog 事件格式化为符合 Elastic 通用架构规范的 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 字段的方法。

LogEventPropertiesToFilter

一个 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