Elasticsearch:Golang ECS 日志记录 - zerolog

75 阅读2分钟

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

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

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



1.  {
2.    "log.level": "info",
3.    "@timestamp": "2020-09-13T10:48:03.000Z",
4.    "message":" some logging info",
5.    "ecs.version": "1.6.0"
6.  }


安装

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

go.mod



1.  module zerolog-logging
2.  require go.elastic.co/ecszerolog main


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

go get go.elastic.co/ecszerolog

配置

设置默认记录器。例如:



1.  logger := ecszerolog.New(os.Stdout)
2.  log.Logger = logger


示例

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

zerolog.go



1.  package main

3.  import (
4.  	"os"

6.  	"github.com/rs/zerolog"
7.  	"github.com/rs/zerolog/log"
8.  	"go.elastic.co/ecszerolog"
9.  )

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

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

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

21.  	log.Info().
22.  		Str("foo", "bar").
23.  		Dict("dict", zerolog.Dict().
24.  			Str("bar", "baz").
25.  			Int("n", 1),
26.  		).Msg("hello world")
27.  }


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

go run zerolog.go

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



1.  $ go run zerolog.go
2.  {"log.level":"info","ecs.version":"1.6.0","@timestamp":"2024-07-23T02:46:52.612Z","message":"hello world"}
3.  {"log.level":"info","ecs.version":"1.6.0","custom":"foo","@timestamp":"2024-07-23T02:46:52.612Z","message":"Hello, World!"}
4.  {"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



1.  package main

3.  import (
4.  	"os"

6.  	"github.com/rs/zerolog"
7.  	"github.com/rs/zerolog/log"
8.  	"go.elastic.co/ecszerolog"
9.  )

11.  func main() {
12.  	file, err := os.OpenFile(
13.  		"myapp.log",
14.  		os.O_APPEND|os.O_CREATE|os.O_WRONLY,
15.  		0664,
16.  	)
17.  	if err != nil {
18.  		panic(err)
19.  	}

21.  	defer file.Close()

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

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

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

32.  	log.Info().
33.  		Str("foo", "bar").
34.  		Dict("dict", zerolog.Dict().
35.  			Str("bar", "baz").
36.  			Int("n", 1),
37.  		).Msg("hello world")
38.  }


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



1.  $ pwd
2.  /Users/liuxg/go/go-logging
3.  $ go run zerolog_file.go 
4.  $ ls
5.  go.mod          go.sum          myapp.log       zerolog         zerolog.go      zerolog_file.go
6.  $ cat myapp.log 
7.  {"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"}
8.  {"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!"}
9.  {"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



1.  filebeat.inputs:
2.  - type: filestream  # 1
3.    paths: /path/to/logs.json
4.    parsers:
5.      - ndjson:
6.        overwrite_keys: true # 2
7.        add_error_key: true  # 3
8.        expand_keys: true    # 4

10.  processors: # 5
11.    - add_host_metadata: ~
12.    - add_cloud_metadata: ~
13.    - add_docker_metadata: ~
14.    - 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



1.  filebeat.inputs:
2.  - type: log
3.    paths: /path/to/logs.json
4.    json.keys_under_root: true
5.    json.overwrite_keys: true
6.    json.add_error_key: true
7.    json.expand_keys: true

9.  processors:
10.  - add_host_metadata: ~
11.  - add_cloud_metadata: ~
12.  - add_docker_metadata: ~
13.  - add_kubernetes_metadata: ~