当前位置: 首页 > news >正文

Elasticsearch:Golang ECS 日志记录 - zap

ECS 记录器是你最喜欢的日志库的格式化程序/编码器插件。它们可让你轻松地将日志格式化为与 ECS 兼容的 JSON。

编码器以 JSON 格式记录日志,并在可能的情况下依赖默认的 zapcore/json_encoder。它还处理 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/ecszap master
require go.uber.org/zap master

我们使用如下的命令来下载包:

go get go.elastic.co/ecszap
go get go.uber.org/zap

配置

设置默认记录器。例如:

encoderConfig := ecszap.NewDefaultEncoderConfig()
core := ecszap.NewCore(encoderConfig, os.Stdout, zap.DebugLevel)
logger := zap.New(core, zap.AddCaller())

你可以自定义 ECS 记录器。例如:

encoderConfig := ecszap.EncoderConfig{EncodeName: customNameEncoder,EncodeLevel: zapcore.CapitalLevelEncoder,EncodeDuration: zapcore.MillisDurationEncoder,EncodeCaller: ecszap.FullCallerEncoder,
}
core := ecszap.NewCore(encoderConfig, os.Stdout, zap.DebugLevel)
logger := zap.New(core, zap.AddCaller())

示例

使用结构化日志记录

zap1.go

package mainimport ("errors""os""go.elastic.co/ecszap""go.uber.org/zap"
)func main() {encoderConfig := ecszap.NewDefaultEncoderConfig()core := ecszap.NewCore(encoderConfig, os.Stdout, zap.DebugLevel)logger := zap.New(core, zap.AddCaller())logger = logger.With(zap.String("custom", "foo"))logger = logger.Named("mylogger")// Use strongly typed Field valueslogger.Info("some logging info",zap.Int("count", 17),zap.Error(errors.New("boom")))
}

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

go run zap1.go | jq .

Log errors

zap_error.go

package mainimport ("errors""os"pkgerrors "github.com/pkg/errors""go.elastic.co/ecszap""go.uber.org/zap"
)func main() {encoderConfig := ecszap.NewDefaultEncoderConfig()core := ecszap.NewCore(encoderConfig, os.Stdout, zap.DebugLevel)logger := zap.New(core, zap.AddCaller())err := errors.New("boom")logger.Error("some error", zap.Error(pkgerrors.Wrap(err, "crash")))
}

我们使用如下的命令来运行应用:

go run zap_error.go | jq .

使用 sugar logger

zap_sugar.go

package mainimport ("os""go.elastic.co/ecszap""go.uber.org/zap"
)func main() {encoderConfig := ecszap.NewDefaultEncoderConfig()core := ecszap.NewCore(encoderConfig, os.Stdout, zap.DebugLevel)logger := zap.New(core, zap.AddCaller())sugar := logger.Sugar()sugar.Infow("some logging info","foo", "bar","count", 17,)
}

我们使用如下的命令来运行:

go run zap_sugar.go | jq .

 把日志写入到 Elasticsearch

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

 Filebeat 7.16+

filebeat.yaml

filebeat.inputs:
- type: filestream  # 1paths: /path/to/logs.jsonparsers:- ndjson:overwrite_keys: true # 2add_error_key: true  # 3expand_keys: true    # 4processors: # 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: logpaths: /path/to/logs.jsonjson.keys_under_root: truejson.overwrite_keys: truejson.add_error_key: truejson.expand_keys: trueprocessors:
- add_host_metadata: ~
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~

相关文章:

  • Sokit(TCP/UDP调试工具)
  • 均匀圆形阵列原理及MATLAB仿真
  • Spring Boot集成Redis与Lua脚本:构建高效的分布式多规则限流系统
  • 人工智能与机器学习原理精解【5】
  • 如何查看cpu架构,查看CPU架构的方法
  • Pytorch深度学习实践(10)循环神经网络RNN
  • 昇思25天学习打卡营第24天|RNN实现情感分类
  • 黑马JavaWeb企业级开发(知识清单)03——HTML实现正文:排版(音视频、换行、段落)、布局标签(div、span)、盒子模型
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • Typescript学习笔记(2.0)
  • Pytorch使用教学4-张量的索引
  • 88个python的基本语法知识【二】
  • 找工作准备刷题Day10 回溯算法 (卡尔41期训练营 7.24)
  • 心跳机制详解
  • 【python】python基于 Q-learning 算法的迷宫游戏(源码+论文)【独一无二】
  • [deviceone开发]-do_Webview的基本示例
  • egg(89)--egg之redis的发布和订阅
  • Electron入门介绍
  • gf框架之分页模块(五) - 自定义分页
  • JavaScript DOM 10 - 滚动
  • JavaScript服务器推送技术之 WebSocket
  • mysql外键的使用
  • PHP的Ev教程三(Periodic watcher)
  • Redis在Web项目中的应用与实践
  • WinRAR存在严重的安全漏洞影响5亿用户
  • Zepto.js源码学习之二
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 警报:线上事故之CountDownLatch的威力
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 目录与文件属性:编写ls
  • 配置 PM2 实现代码自动发布
  • 前端js -- this指向总结。
  • 一道面试题引发的“血案”
  • 一个完整Java Web项目背后的密码
  • 译自由幺半群
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • Nginx实现动静分离
  • 积累各种好的链接
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #在 README.md 中生成项目目录结构
  • $.ajax()方法详解
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (06)Hive——正则表达式
  • (39)STM32——FLASH闪存
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (十三)MipMap
  • (一) springboot详细介绍
  • .Net Core与存储过程(一)
  • .Net MVC4 上传大文件,并保存表单