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

在我的上一篇文章 “Beats:使用 Filebeat 从 Python 应用程序中提取日志” 里,我详述了如何使用 Python 来生成日志,并使用 Filebeat 来收集日志到 Elasticsearch 中。在今天的文章中,我来详细描述如何使用 Node.js 来生成 ECS 相兼容的日子。ECS 相兼容的日志符合易于 Elasticsearch 对日志进行分析并进行可视化。

介绍

Node.js ECS 记录器是你最喜欢的日志库的格式化插件。它们可轻松将你的日志格式化为与 ECS 兼容的 JSON。结合 filebeat,你可以将日志直接发送到 Elasticsearch,并利用 Kibana 的日志应用程序在一个地方检查所有日志。

Node.js ECS 日志格式化程序记录结构化的 JSON,并支持对来自 Node.js 核心和流行 Web 框架的错误对象和 HTTP 请求和响应对象进行序列化。最小日志记录包括以下字段:

{
  "@timestamp": "2021-01-13T21:32:38.095Z",
  "log.level": "info",
  "message": "hi",
  "ecs.version": "8.10.0"
}

提示:想要了解有关 ECS、ECS 日志记录和其他可用语言插件的更多信息?请参阅 ECS 日志记录指南。

有关如何生成 ECS 相兼容的日子,我们有如下的几种方法。

  • Pino
  • Winston
  • Morgan

在今天的文章里,我们先来介绍 Pino。

使用 Pino 进行 ECS 日志记录

此 Node.js 包为 pino 记录器提供了格式化程序,与 Elastic Common Schema (ECS) 日志记录兼容。结合 Filebeat 发送器,你可以在 Elastic Stack 中的一处监控所有日志。支持 pino 6.x、7.x 和 8.x 版本。

设置

安装

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

配置

const { ecsFormat } = require('@elastic/ecs-pino-format');
const pino = require('pino');

const log = pino(ecsFormat(/* options */));  // 1
log.info('hi');
log.error({ err: new Error('boom') }, 'oops there is a problem');
// ...
  • 这将配置 Pino 的 formatters、messageKey 和 timestamp 选项。

配置 filebeat

1)Filebeat 7.16+。

filebeat.yml

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

2)Filebeat < 7.16

filebeat.yml

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

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

更多关于如何配置 Filebeat,请参考文章 “Beats:使用 Filebeat 从 Python 应用程序中提取日志”。

如何使用

我们创建如下的一个简单的应用:

pino-logging.js

const { ecsFormat } = require('@elastic/ecs-pino-format');
const pino = require('pino');

const log = pino(ecsFormat(/* options */)); 
log.info('Hello world');

const child = log.child({ module: 'foo' });
child.warn('From child');

运行上面的代码:

node pino-logging.js 
$ node pino-logging.js 
{"log.level":"info","@timestamp":"2024-07-08T01:32:42.947Z","process.pid":43946,"host.hostname":"liuxgm.local","ecs.version":"8.10.0","message":"Hello world"}
{"log.level":"warn","@timestamp":"2024-07-08T01:32:42.947Z","process.pid":43946,"host.hostname":"liuxgm.local","ecs.version":"8.10.0","module":"foo","message":"From child"}

在配置 ecsFormat 时,我们在下面将会看到更多的选项。

Error logging

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

pino-logging.js

const { ecsFormat } = require('@elastic/ecs-pino-format');
const pino = require('pino');
const log = pino(ecsFormat());

const myErr = new Error('boom');
log.info({ err: myErr }, 'oops');

将产生(为了便于阅读,打印得很漂亮):

这类似于并覆盖了 Pino 的默认 err 序列化器。可以通过 convertErr: false 选项禁用对 err 字段的特殊处理:

const log = pino(ecsFormat({ convertErr: false }));

HTTP 请求和响应日志记录

使用 convertReqRes: true 选项,格式化程序将在分别作为 req 和 res 字段传递时自动转换 Node.js 核心 request 和 response 对象。(此选项取代了 req 和 res Pino 序列化器的使用。)

pino-logging.js

const http = require('http');
const { ecsFormat } = require('@elastic/ecs-pino-format');
const pino = require('pino');

const log = pino(ecsFormat({ convertReqRes: true }));  // 1

const server = http.createServer(function handler (req, res) {
  res.setHeader('Foo', 'Bar');
  res.end('ok');
  log.info({ req, res }, 'handled request');  // 2
});

server.listen(3000, () => {
  log.info('listening at http://localhost:3000');
})
  1. 使用 convertReqRes 选项
  2. 使用 req 和/或 res 字段进行记录

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

为了生成上面的日子,我们需要访问本地的服务器 http://localhost:3000/.

examples/ 目录展示了使用请求和响应日志的示例程序:使用 Express、使用 pino-http 中间件包等。

使用 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": "9f338eae7211b7993b98929046aed21d",
  "transaction.id": "2afbef5642cc7a3f",
...

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

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

const log = pino(ecsFormat({ apmIntegration: false }));

限制和注意事项

ecs-logging 规范建议日志记录中的前三个字段必须是 @timestamp、log.level 和 message。Pino 不提供将 message 字段放在前面的机制。鉴于 ecs-logging 字段的排序是为了便于阅读,并且不会影响互操作性,因此这并不是一个重大问题。

Pino 当前提供的钩子(hook)不允许此包转换传递给 <logger>.child({ ... }) 的字段。这意味着,即使使用 convertReqRes 选项,对 <logger>.child({ req }) 的调用也不会将该 req 转换为 ECS HTTP 字段。对于执行此操作的 pino-http 用户来说,这是一个轻微的限制。

参考

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} 的默认设置。

为 pino(...) 创建选项,用于配置 ECS 日志记录格式输出。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是数据标准?企业进行数据标准管理有这么多好处?

随着大数据、云计算和人工智能等技术的兴起&#xff0c;企业对数据的依赖程度日益增加。然而&#xff0c;数据的快速增长带来了一系列挑战&#xff0c;其中之一就是如何确保数据的一致性和准确性。这正是数据标准管理发挥作用的地方。 数据标准管理构成了数据管理的核心部分&a…

C语言学习网站推荐

1.C语言中文网&#xff1a; http://c.biancheng.net/view/510.html 此网站会提供很多关于C语言的入门算法&#xff0c;教程等等。分享的C语言知识结构是比较完整的。此网站还提供了很多关于C语言的资料&#xff0c;代码。有些资料是免费的&#xff0c;有些是需要付费的。 2.5…

常用知识碎片 Vue3 ref和reactive (内含其他常用知识)

目录 ref和reactive ref reactive 总结&#xff1a; setup语法糖 语法糖是啥&#xff1f; Vue3 setup语法糖 Vue3 不使用setup语法糖示例&#xff1a; Vue3 使用setup语法糖示例&#xff1a; ref和eative主要区别 ref和reactive 在 Vue 3 中&#xff0c;ref 和 reac…

git仓库使用

一、没有仓库 首先要有gitee账号 创建仓库 有了仓库就按已有仓库进行操作 二、已有仓库 先让仓库负责人把自己拉进仓库 成为开发者或者管理员 git clone 仓库地址 开始工作 git add . git commit -m “ 提交说明” git pull 更新一下也叫同步 将线上代码更新到本地 git pu…

BUUCTF[堆][unsortbin]

fastbin Attack 、unsorted bin 思路&#xff1a; 利用double free的方式泄漏出unsortbin中的main_arena地址。 释放一个不属于fast bin 的 chunk&#xff0c;并且该 chunk 不和 top chunk 紧邻时&#xff0c;该 chunk 会被首先放到 unsorted bin 中。 当有一个(或几个) sma…

BUCK电源芯片,电气参数,极限参数,工作特性,引脚功能

概述 在应用DC-DC开关电源芯片时&#xff0c;通常需要关注以下参数&#xff0c;同步与非同步&#xff0c;输入电压&#xff0c;输入电流&#xff0c;输出电压&#xff0c;输出电流&#xff0c;输入输出电容的选择&#xff1b;mosfet选型&#xff0c;电感选型&#xff0c;功耗&a…

Kodcloud可道云安装与一键发布上线实现远程访问详细教程

文章目录 1.前言2. Kodcloud网站搭建2.1. Kodcloud下载和安装2.2 Kodcloud网页测试 3. cpolar内网穿透的安装和注册4. 本地网页发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6.结语 1.前言 本文主要为大家介绍一款国人自研的在线Web文件管理器可道云&#xff0c;…

[Python学习篇] Python多线程

多线程 Python 多线程编程是一种在单个程序中同时执行多个线程的技术&#xff0c;主要用于提高程序的并发性和性能&#xff0c;尤其是在 I/O 操作频繁的场景下。Python 提供了 threading 模块来支持多线程编程。 基本概念 线程&#xff1a;线程是一个独立的执行流&#xff0c;可…

【SpringBoot Web框架实战教程】08 SpringBoot 自定义异常处理输出

不积跬步&#xff0c;无以至千里&#xff1b;不积小流&#xff0c;无以成江海。大家好&#xff0c;我是闲鹤&#xff0c;公众号&#xff1a;xxh_zone&#xff0c;十多年开发、架构经验&#xff0c;先后在华为、迅雷服役过&#xff0c;也在高校从事教学3年&#xff1b;目前已创业…

基于FPGA的数字信号处理(16)--定点数的舍入模式(7)6种舍入模式的总结

前言 在前面的6篇文章中&#xff0c;分别对6中舍入模式做了详细的介绍&#xff0c;本文在前文的基础上&#xff0c;再对这6种舍入模式做一个对比和总结。 6种舍入模式 在数据处理过程中&#xff0c;为了防止数据溢出而增加位宽是一种很常见的处理方式&#xff0c;但是随着算法链…

中国科学院地理所牛书丽团队《Global Change Biology 》最新成果!

本文首发于“生态学者”微信公众号&#xff01; 在全球气候变化的背景下&#xff0c;干旱地区的扩张对生态系统的氮循环产生了深远影响。氮同位素&#xff08;δ15N&#xff09;的天然丰度&#xff0c;尤其是土壤中的δ15N&#xff0c;是评估陆地生态系统氮循环动态和氮限制的关…

固定资产定位追踪管理系统

固定资产定位跟踪管理系统是一个利用技术手段对公司资产进行定位、跟踪和管理的系统。它帮助企业实时了解资产的位置、情况和使用情况&#xff0c;提高固定资产管理的效率和准确性。以下是该系统的主要功能和优势&#xff1a;  固定资产识别和识别&#xff1a;系统通过使用识…

springboot大学校园二手书交易APP-计算机毕业设计源码25753

摘 要 在数字化与移动互联网迅猛发展的今天&#xff0c;人们对于图书的需求与消费方式也在悄然改变。为了满足广大读者对图书的热爱与追求&#xff0c;我们倾力打造了一款基于Android平台的图书交易APP。这款APP不仅汇聚了海量的图书资源&#xff0c;提供了便捷的交易平台&…

边缘计算盒子_B100_Jetson Nano (aarch64)开发环境搭建

目录 一、刷机步骤1、搭建刷机环境2、进入刷机模式3、开始刷机 二、系统迁移到TF卡 或者 U盘1、迁移脚本2、提前插入U盘或者TF卡3、 开始迁移 三、搭建miniconda 环境1、下载安装 四、jetpack开发套件环境1、版本查看2、apt 更换国内源3、安装Jetson-stats管理工具 一、刷机步骤…

图纸文档管理新篇章:陕西航沣与三品软件合作 优化研发流程

近日&#xff0c;陕西航沣新材料有限公司与三品软件正式达成合作协议&#xff0c;共同打造高效、智能的图纸文档管理平台。此次合作旨在赋能陕西航沣在高性能碳纤维增强纸基摩擦材料领域的创新与发展&#xff0c;提升企业的核心竞争力。 客户简介 陕西航沣新材料有限公司&…

【通过pnpm创建vite项目】

vue3最新项目技术构建后台管理系统 一、技术要求二、安装pnpm2.1 构建vite三、项目配置3.1 eslint 配置3.2 prettier配置3.3 stylelint配置3.4 配置husky3.5 配置commitlint3.6 pnpm 强制安装四、Element-plus 引入4.1 完整引入4.2 国际化配置4.3 配置别名4.4 Env环境配置4.5 s…

【2024_CUMCM】数据预处理、数据分析、数据可视化

目录 2023-c题-问题1 问题分析 偏度 峰度 箱线图 读图 重采样、降采样、升采样 重采样 降采样 升采样 解题代码 2023-c题-问题1 问题分析 问题说白了就是探究品类和销售量这两个数据他们各自内在联系&#xff0c;根据题意&#xff0c;我们先进行数 据预处理&#…

机器视觉:(1) 初识Roboflow(使用详解一)获取数据集(最新)

一&#xff1a;访问地址 [1] Roboflow官网&#xff1a;官网地址 [2]YOLOv8 项目地址github源码地址 [3]YOLOv8 官方教程官网教程地址 二&#xff1a;获取数据集步骤 1.访问官网地址&#xff1a;进入首页面&#xff0c;点击登录 2.注册过程省略了&#xff0c;按步骤走就可以…

01. 课程简介

1. 课程简介 本课程的核心内容可以分为三个部分&#xff0c;分别是需要理解记忆的计算机底层基础&#xff0c;后端通用组件以及需要不断编码练习的数据结构和算法。 计算机底层基础可以包含计算机网络、操作系统、编译原理、计算机组成原理&#xff0c;后两者在面试中出现的频…

【MySQL】mysqldumpslow工具 -- 总结慢查询日志文件

1. 作用 在平时使用MySQL数据库时&#xff0c;经常进行查询操作&#xff0c;有些查询语句执行的时间非常长&#xff0c;当执行时间超过设定的阈值时&#xff0c;我们称这个查询为慢查询&#xff0c;慢查询的相关信息通常需要用日志记录下来称为慢查询日志&#xff0c;mysqldum…