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
- 按照 Filebeat 快速入门
- 将以下配置添加到你的 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: ~
- 使用 filestream 输入从活动日志文件中读取行。
- 如果发生冲突,解码的 JSON 对象的值将覆盖 Filebeat 通常添加的字段(type、source、offset 等)。
- 如果发生 JSON 解组错误,Filebeat 将添加 “error.message” 和 “error.type: json” 键。
- Filebeat 将递归地从解码的 JSON 中去掉点键,并将其扩展为分层对象结构。
- 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: ~