Elasticsearch:Node.js ECS 日志记录 - Winston

这是继上一篇文章 “Elasticsearch:Node.js ECS 日志记录 - Pino” 的续篇。我们继续上一篇文章来讲述使用 Winston 包来针对 Node.js 应用生成 ECS 向匹配的日子。此 Node.js 软件包为 winston 记录器提供了格式化程序,与 Elastic Common Schema (ECS) 日志记录兼容。结合 Filebeat 发送器,你可以在 Elastic Stack 中的一处监控所有日志。支持 winston 3.x 版本 >=3.3.3。

设置

安装

npm install @elastic/ecs-winston-format
npm install winston

配置

winston-logging.js

const winston = require('winston');
const { ecsFormat } = require('@elastic/ecs-winston-format');const logger = winston.createLogger({format: ecsFormat(/* options */),  // 1transports: [new winston.transports.Console()]
});logger.info('hi');
logger.error('oops there is a problem', { err: new Error('boom') });
  • 将 ECS 格式化程序传递给 winston。

上面的代码的运行结果为:

配置 Filebeat

Filebeat 7.16+

filebeat.yml

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 以了解更多信息。

Filebeat < 7.16

filebeat.yml

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: ~

有关更多信息,请参阅 Filebeat 参考。

如何使用

winston-logging.js

const winston = require('winston');
const { ecsFormat } = require('@elastic/ecs-winston-format');const logger = winston.createLogger({level: 'info',format: ecsFormat(/* options */), // 1transports: [new winston.transports.Console()]
});logger.info('hi');
logger.error('oops there is a problem', { foo: 'bar' });
  1. 请参阅下面的可用选项。
node winston-logging.js | jq .

运行此脚本(可在此处获得)将产生类似上面内容的日志输出。

格式化程序负责将数据序列化为 JSON,因此你无需添加 json 格式化程序。此外,格式化程序会自动生成 timestamp,因此你无需添加 timestamp 格式化程序。

Error logging

默认情况下,格式化程序会将 Error 实例的 err 元字段转换为 ECS Error 字段。例如例子:

winston-logging.js

const winston = require('winston');
const { ecsFormat } = require('@elastic/ecs-winston-format');
const logger = winston.createLogger({format: ecsFormat(), transports: [new winston.transports.Console()]
});const myErr = new Error('boom');
logger.info('oops', { err: myErr }); 

可以通过 convertErr: false 选项禁用对 err 元字段的特殊处理:

winston-logging.js

const winston = require('winston');
const { ecsFormat } = require('@elastic/ecs-winston-format');
const logger = winston.createLogger({format: ecsFormat({convertErr: false} ), transports: [new winston.transports.Console()]
});const myErr = new Error('boom');
logger.info('oops', { err: myErr }); 

HTTP 请求和响应日志记录

使用 convertReqRes: true 选项,格式化程序将在分别作为 req 和 res 元字段传递时自动转换 Node.js 核 request 和 response 对象。

winston-logging.js

const http = require('http');
const winston = require('winston');
const { ecsFormat } = require('@elastic/ecs-winston-format');const logger = winston.createLogger({level: 'info',format: ecsFormat({ convertReqRes: true }), // 1transports: [new winston.transports.Console()]
});const server = http.createServer(handler);
server.listen(3000, () => {logger.info('listening at http://localhost:3000')
});function handler (req, res) {res.setHeader('Foo', 'Bar');res.end('ok');logger.info('handled request', { req, res }); // 2
}
  1. 使用 convertReqRes 选项
  2. 记录 req 和/或 res 元字段

这将使用 ECS HTTP 字段生成包含请求和响应信息的日志。例如例子:

 在上面,我们需要访问 http://localhost:3000 才能看到如上所示的日子信息。

使用 APM 进行日志关联

此 ECS 日志格式化程序与 Elastic APM 集成。如果你的 Node 应用正在使用 Node.js Elastic APM Agent,则会将多个字段添加到日志记录中,以关联 APM 服务或跟踪和日志数据:

  • 当前跟踪 span 时调用的日志语句(例如 logger.info(...))将包括跟踪字段 — trace.id、transaction.id、span.id。
  • 由 APM 代理确定或在 APM 代理上配置的多个服务标识符字段允许在 Kibana 中的服务和日志之间进行交叉链接 — service.name、service.version、service.environment、service.node.name。
  • event.dataset 在 Elastic Observability 应用中启用日志率异常检测。

例如,运行 examples/http-with-elastic-apm.js 和 curl -i localhost:3000/ 会产生包含以下内容的日志记录:

% node examples/http-with-elastic-apm.js | jq .
..."service.name": "http-with-elastic-apm","service.version": "1.4.0","service.environment": "development","event.dataset": "http-with-elastic-apm""trace.id": "7fd75f0f33ff49aba85d060b46dcad7e","transaction.id": "6c97c7c1b468fa05"
}

这些 ID 与 APM 代理报告的跟踪数据相匹配。

可以通过 apmIntegration: false 选项明确禁用与 Elastic APM 的集成,例如:

const logger = winston.createLogger({format: ecsFormat({ apmIntegration: false }),// ...
})

限制和注意事项

ecs-logging 规范建议日志记录中的前三个字段应为 @timestamp、log.level 和 message。从 1.5.0 版开始,此格式化程序不遵循此建议。这是可能的,但需要在 ecsFields 中为每个日志记录创建一个新对象。鉴于 ecs-logging 字段的排序是为了便于阅读,并且不会影响互操作性,因此决定优先考虑性能。

参考

ecsFormat([options])

  • options {type-object} 支持以下选项:
    • convertErr {type-boolean} 是否将记录的 err 字段转换为 ECS 错误字段。默认值:true。
    • convertReqRes {type-boolean} 是否将记录的 req 和 res HTTP 请求和响应字段记录到 ECS HTTP、用户代理和 URL 字段。默认值:false。
    • apmIntegration {type-boolean} 是否启用 APM 代理集成。默认值:true。
    • serviceName {type-string} “service.name” 值。如果指定,则覆盖来自活动 APM 代理的任何值。
    • serviceVersion {type-string} “service.version” 值。如果指定,则覆盖来自活动 APM 代理的任何值。
    • serviceEnvironment {type-string} “service.environment” 值。如果指定,则覆盖来自活动 APM 代理的任何值。
    • serviceNodeName {type-string} “service.node.name” 值。如果指定,则将覆盖来自活动 APM 代理的任何值。
    • eventDataset {type-string} “event.dataset”值。如果指定,则将覆盖使用 ${serviceVersion} 的默认值。

为 winston 创建以 ECS 日志记录格式发出的格式化程序。这是一种处理 ecsFields([options]) 和 ecsStringify([options]) 的单一格式。以下两个是等效的:

const { ecsFormat, ecsFields, ecsStringify } = require('@elastic/ecs-winston-format');
const winston = require('winston');const logger = winston.createLogger({format: ecsFormat(/* options */),// ...
});const logger = winston.createLogger({format: winston.format.combine(ecsFields(/* options */),ecsStringify()),// ...
});

ecsFields([options])

  • options {type-object} 支持以下选项:
    • convertErr {type-boolean} 是否将记录的 err 字段转换为 ECS 错误字段。默认值:true。
    • convertReqRes {type-boolean} 是否将记录的 req 和 res HTTP 请求和响应字段记录到 ECS HTTP、用户代理和 URL 字段。默认值:false。
    • apmIntegration {type-boolean} 是否启用 APM 代理集成。默认值:true。
    • serviceName {type-string} “service.name” 值。如果指定,则覆盖来自活动 APM 代理的任何值。
    • serviceVersion {type-string} “service.version” 值。如果指定,则覆盖来自活动 APM 代理的任何值。
    • serviceEnvironment {type-string} “service.environment” 值。如果指定,则覆盖来自活动 APM 代理的任何值。
    • serviceNodeName {type-string} “service.node.name” 值。如果指定,则将覆盖来自活动 APM 代理的任何值。
    • eventDataset {type-string} “event.dataset”值。如果指定,则将覆盖使用 ${serviceVersion} 的默认设置。

为 winston 创建一个格式化程序,将日志记录信息对象上的字段转换为 ECS 日志记录格式。

ecsStringify([options])

为 winston 创建一个格式化程序,将日志记录字符串化/序列化为 JSON。

这类似于 logform.json()。它们都使用 safe-stable-stringify 包来生成 JSON。一些区别:

  • 此字符串化器跳过序列化 level 字段,因为它不是 ECS 字段。
  • Winston 提供了一个将 bigint 转换为字符串的 replacer。这样做的理由是 JavaScript JSON 解析器在解析 bigint 时会丢失精度。反对的理由是 BigInt 将类型更改为字符串而不是数字。目前,此字符串化器不会将 BitInt 转换为字符串。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】MySQL连接池原理与简易网站数据流动是如何进行

MySQL连接池原理与简易网站数据流动是如何进行 1.MySQL连接池原理2.简易网站数据流动是如何进行 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f60…

SSM高校学生综合测评系统-计算机毕业设计源码16154

摘要 随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个BS 结构的高校学生综合测评系统,会使高校学生综合测评系统工作系统化、规范化,也会提高高校学生综合测评系统平台形象,提高管理效率。 本学生综合测评系统是针对目前高校学生…

君方智能设计平台-对象持久化技术方案

1.背景介绍 1.1序列化功能 序列化是将复杂的图形对象、数据结构或对象转换成一种可被存储、传输或分享的格式的过程。这个格式通常是二进制或文本形式&#xff0c;能够轻松地保存在文件中或通过网络发送到其他应用程序。序列化的目的是将数据持久化&#xff0c;使其在不同时间…

服务器本地部署文件服务器minio

minio类似于阿里云的OSS&#xff0c;为不方便把图、文、日志等形式的文件保存在公有云上的&#xff0c;可以在自己的服务器上部署文件服务器 看过本人前几个文章的&#xff0c;使用docker就会很快上手部署&#xff0c;直接上所有代码 #添加镜像 docker search minio docker p…

怎么给电子文档批量盖骑缝章或公章?

怎么给电子文档批量盖骑缝章或公章?假如你有100个PDF电子文档要同时盖缝章&#xff0c;如果不借助专业的盖电子骑缝章软件&#xff0c;还真不好干。下面讲述如何利用e-章宝批量盖电子骑缝章。 1.在软件中导入待批量盖章的PDF文件 如下图&#xff0c;在“待盖章PDF文件”区域…

谨慎投稿!这本EI期刊正在被“劫持”!

Journsl ofTisniin lniversity Seience and Technology《天津大学学报&#xff08;自然科学与工程技术版&#xff09;》创刊于l955年&#xff0c;月刊&#xff0c;全国核心期刊&#xff0c;天津市一级期刊。该刊是由天津大学主办的综合性学术刊物&#xff0c;主要刊登自然科学和…

这款拖拽式大屏设计神器,太惊艳了!收藏吧!

概念​ 可视化大屏是当今信息时代的一种重要技术工具&#xff0c;它以大屏幕为显示终端&#xff0c;通过图形、图表、地图等形式将大量数据和信息直观地呈现出来&#xff0c;帮助用户更好地理解和分析数据。 JVS智能BI的可视化大屏从界面布局、色彩搭配&#xff0c;到图表类型…

大模型推理加速调研(框架、方法)

大模型推理加速的目标是高吞吐量、低延迟。吞吐量为一个系统可以并行处理的任务量。延时&#xff0c;指一个系统串行处理一个任务时所花费的时间。调研了一些大模型推理的框架。 框架llama.cpprtp-llmvllmTensorRT-LLMLMDeployfastllm语言Chttps://github.com/ggerganov/llama…

SpringBoot项目——送水管理系统

1、导入坐标 坐标作用pagehelper-spring-boot-startermybatis分页插件spring-boot-starter-thymeleafJSP模板引擎mybatis-spring-boot-startermybatisspring-boot-starter-webwebspring-boot-starter-testtestlombok不需要再写getter、setter或equals方法&#xff0c;只要有一…

3D问界—什么是blender,与MAYA有什么区别

问题提出&#xff1a;什么是blender&#xff0c;与MAYA有什么区别 Blender 是一个开源的、免费的 3D 建模和动画软件&#xff0c;广泛应用于各种领域。它提供了丰富的功能和工具&#xff0c;适用于从业余爱好者到专业艺术家的不同需求。 1. Blender 的主要用途和功能 属 性描述…

Vue2基础 13:内置指令

内置指令 1 指令梳理2 补充指令2.1 v-text2.2 v-html2.3 v-cloak案例--延迟引入vue造成js阻塞 2.4 v-once案例--点击按钮1并展示初始的值 2.5 v-pre 1 指令梳理 前面几节的基础学习已经用到了部分的指令&#xff0c;先梳理一下。 指令描述v-bind单向绑定解析表达式&#xff0…

高项论文老是过不了!换种方法与思路…

2024年上半年信息系统项目管理师成绩公布后&#xff0c;许多考生的论文成绩都不理想&#xff0c;很多人得了30多分&#xff0c;及格线上的考生大多只有45、46分&#xff0c;而50分以上的考生似乎并不多。以下应该是许多考生的心声&#xff1a; 每次都是论文不及格&#xff0c;…

蚂蚁全媒体总编刘鑫炜谈新媒体时代艺术家如何创建及提升个人品牌

新媒体时代艺术家如何创建及提升个人品牌形象——专访蚂蚁全媒体总编刘鑫炜 图为蚂蚁全媒体总编刘鑫炜 在新媒体风潮席卷全球的今天&#xff0c;传统艺术与新媒体技术的融合越来越紧密。这种变革不仅改变了艺术作品的呈现方式&#xff0c;也给艺术家们提供了更多的可能性。那么…

【SOLID原则前端中的应用】接口隔离原则(Interface Segregation Principle,ISP)- vue3示例

接口隔离原则&#xff08;Interface Segregation Principle&#xff0c;ISP&#xff09;在Vue 3中的应用 接口隔离原则&#xff08;Interface Segregation Principle&#xff0c;ISP&#xff09;规定&#xff0c;客户端不应该被迫依赖于它不使用的方法。 换句话说&#xff0c;…

图形编辑器基于Paper.js教程07:鼠标画直线或移动路径

探索Paper.js: 使用鼠标绘制直线和轨迹 在数字图形设计和Web应用开发中&#xff0c;提供一个直观和互动的界面供用户绘制图形是极为重要的。Paper.js是一款功能强大的JavaScript库&#xff0c;它使得在HTML5 Canvas上绘制矢量图形变得简单快捷。本文将介绍如何使用Paper.js实现…

LT86101UXE 国产原装 HDMI2.0 / DVI中继器方案 分辨率 4Kx2K 用于多显示器 DVI/HDMI电缆扩展模块

1. 描述 Lontium LT86101UXE HDMI2.0 / DVI中继器特性高速中继器符合HDMI2.0/1.4规范,最大6 gbps高速数据率、自适应均衡RX输入和pre-emphasized TX输出支持长电缆应用程序,没有晶体在船上保存BOM成本,内部灵活的PCB TX巷交换路由。 LT86101UXE HDMI2.0/DVI中继器自动检测线缆损…

新时代【机器学习】与【Pycharm】:【随机数据生成】与智能【股票市场分析】

目录 第一步&#xff1a;准备工作 1.1 安装必要的库 小李的理解&#xff1a; 1.2 导入库 小李的理解&#xff1a; 第二步&#xff1a;生成和准备数据 2.1 生成随机股票数据 小李的理解&#xff1a; 2.2 数据探索与可视化 小李的理解&#xff1a; 2.3 数据处理 小李…

可编程直流电源的恒压模式(CV)和恒流模式(CC)

本文介绍可编程直流电源的恒压模式&#xff08;CV&#xff09;和恒流模式&#xff08;CC&#xff09;。 可编程直流电源在硬件开发过程中经常被用到&#xff0c;通常&#xff0c;它有2种模式&#xff0c;恒压模式&#xff08;CV&#xff09;和恒流模式&#xff08;CC&#xff…

桌面记事便签哪款好 好用的桌面记事本app

很多人喜欢在桌面上记事&#xff0c;尤其是经常使用电脑的上班族&#xff0c;这样查看起来更加方便。但在网上众多的记事软件中&#xff0c;哪款才是最好用的呢&#xff1f; 在众多选择中&#xff0c;敬业签以其出色的功能和用户体验脱颖而出&#xff0c;成为很多人记事的首选…

Debezium报错处理系列之第111篇:Can‘t compare binlog filenames with different base names

Debezium报错处理系列之第111篇:Cant compare binlog filenames with different base names 一、完整报错二、错误原因三、解决方法Debezium从入门到精通系列之:研究Debezium技术遇到的各种错误解决方法汇总: Debezium从入门到精通系列之:百篇系列文章汇总之研究Debezium技…