Elasticsearch:Golang ECS 日志记录 - zerolog

ECS 记录器是你最喜欢的日志库的格式化程序/编码器插件。它们可让你轻松地将日志格式化为与 ECS 兼容的 JSON。在本教程中,我将详述如何

编码器以 JSON 格式记录日志,并以 ECS 错误格式处理错误字段的记录。

默认情况下,会添加以下字段:

复制代码
{
  "log.level": "info",
  "@timestamp": "2020-09-13T10:48:03.000Z",
  "message":" some logging info",
  "ecs.version": "1.6.0"
}

安装

将下面的包添加到你的 go.mod 文件中:

go.mod

复制代码
module zerolog-logging
require go.elastic.co/ecszerolog main

然后,我们在 terminal 中打入如下的命令:

复制代码
go get go.elastic.co/ecszerolog

配置

设置默认记录器。例如:

复制代码
logger := ecszerolog.New(os.Stdout)
log.Logger = logger

示例

我们使用如下的简单例子来进行测试:

zerolog.go

复制代码
package main

import (
	"os"

	"github.com/rs/zerolog"
	"github.com/rs/zerolog/log"
	"go.elastic.co/ecszerolog"
)

func main() {
	logger := ecszerolog.New(os.Stdout)
	log.Logger = logger

	log.Info().Msg("hello world")

	// Add custom fields.
	log.Info().Str("custom", "foo").
		Msg("Hello, World!")

	log.Info().
		Str("foo", "bar").
		Dict("dict", zerolog.Dict().
			Str("bar", "baz").
			Int("n", 1),
		).Msg("hello world")
}

我们可以通过如下的方式来运行代码:

复制代码
go run zerolog.go

我们可以看到如下的输出:

复制代码
$ go run zerolog.go
{"log.level":"info","ecs.version":"1.6.0","@timestamp":"2024-07-23T02:46:52.612Z","message":"hello world"}
{"log.level":"info","ecs.version":"1.6.0","custom":"foo","@timestamp":"2024-07-23T02:46:52.612Z","message":"Hello, World!"}
{"log.level":"info","ecs.version":"1.6.0","foo":"bar","dict":{"bar":"baz","n":1},"@timestamp":"2024-07-23T02:46:52.612Z","message":"hello world"}

上面显示了一个 JSON 的输出格式的日志。它是和 ECS 相兼容的日子输出。更多格式的输出请参阅链接。更多关 zerolog 的使用方法,请参阅文章

我们可以使用如下的方法把日志写入到一个文件中:

zerolog_file.go

复制代码
package main

import (
	"os"

	"github.com/rs/zerolog"
	"github.com/rs/zerolog/log"
	"go.elastic.co/ecszerolog"
)

func main() {
	file, err := os.OpenFile(
		"myapp.log",
		os.O_APPEND|os.O_CREATE|os.O_WRONLY,
		0664,
	)
	if err != nil {
		panic(err)
	}

	defer file.Close()

	logger := ecszerolog.New(file).With().Timestamp().Logger()
	log.Logger = logger

	log.Info().Msg("hello world")

	// Add custom fields.
	log.Info().Str("custom", "foo").
		Msg("Hello, World!")

	log.Info().
		Str("foo", "bar").
		Dict("dict", zerolog.Dict().
			Str("bar", "baz").
			Int("n", 1),
		).Msg("hello world")
}

我们可以通过如下的方法来运行上面的应用:

复制代码
$ pwd
/Users/liuxg/go/go-logging
$ go run zerolog_file.go 
$ ls
go.mod          go.sum          myapp.log       zerolog         zerolog.go      zerolog_file.go
$ cat myapp.log 
{"log.level":"info","ecs.version":"1.6.0","@timestamp":"2024-07-23T03:38:43.361Z","@timestamp":"2024-07-23T03:38:43.361Z","message":"hello world"}
{"log.level":"info","ecs.version":"1.6.0","custom":"foo","@timestamp":"2024-07-23T03:38:43.361Z","@timestamp":"2024-07-23T03:38:43.361Z","message":"Hello, World!"}
{"log.level":"info","ecs.version":"1.6.0","foo":"bar","dict":{"bar":"baz","n":1},"@timestamp":"2024-07-23T03:38:43.361Z","@timestamp":"2024-07-23T03:38:43.361Z","message":"hello world"}

把日志写入到 Elasticsearch

  1. 按照 Filebeat 快速入门
  2. 将以下配置添加到你的 filebeat.yaml 文件中。

Filebeat 7.16+

filebeat.yaml

复制代码
filebeat.inputs:
- type: filestream  # 1
  paths: /path/to/logs.json
  parsers:
    - ndjson:
      overwrite_keys: true # 2
      add_error_key: true  # 3
      expand_keys: true    # 4

processors: # 5
  - add_host_metadata: ~
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
  1. 使用 filestream 输入从活动日志文件中读取行。
  2. 如果发生冲突,解码的 JSON 对象的值将覆盖 Filebeat 通常添加的字段(type、source、offset 等)。
  3. 如果发生 JSON 解组错误,Filebeat 将添加 "error.message" 和 "error.type: json" 键。
  4. Filebeat 将递归地从解码的 JSON 中去掉点键,并将其扩展为分层对象结构。
  5. Processors 可增强你的数据。请参阅 processors 以了解更多信息。

Filebeat < 7.16

filebeat.yaml

复制代码
filebeat.inputs:
- type: log
  paths: /path/to/logs.json
  json.keys_under_root: true
  json.overwrite_keys: true
  json.add_error_key: true
  json.expand_keys: true

processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~
相关推荐
2301_800976936 分钟前
正则表达式
开发语言·python·正则表达式
故事还在继续吗11 分钟前
C++20关键特性
开发语言·c++·c++20
jkyy201421 分钟前
AI运动数字化:以技术重塑场景,健康有益赋能全域运动健康管理
大数据·人工智能·健康医疗
金融小师妹29 分钟前
4月30日多因子共振节点:鲍威尔“收官效应”与权力结构重塑的预期重构
大数据·人工智能·重构·逻辑回归
2601_9499251833 分钟前
AI Agent如何重构跨境物流的决策?
大数据·人工智能·重构·ai agent·geo优化·物流科技
青少儿编程课堂1 小时前
2026青少儿信息素养大赛备赛指南!Python/Scratch/C++备考要点
开发语言·c++·python
xiaoduo AI1 小时前
客服机器人问题解决率怎么统计?Agent系统自动判断是否解决,比人工回访准?
大数据·人工智能·机器人
AIFarmer1 小时前
【无标题】
开发语言·c++·算法
昇腾CANN2 小时前
TileLang-Ascend 算子性能优化方法与实操
开发语言·javascript·性能优化·昇腾·cann
沐知全栈开发2 小时前
ionic 手势事件详解
开发语言