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

news2024/9/30 5:32:38

这是之前系列文章:

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

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

中的第三篇文章。在今天的文章中,我将描述如何使用 Morgan 包针对 Node.js 应用进行日子记录。此 Morgan Node.js 软件包为 morgan 日志中间件(通常与 Express 一起使用)提供了一个格式化程序,与 Elastic Common Schema (ECS) 日志记录兼容。结合 Filebeat 发送器,你可以在 Elastic Stack 中的一处监控所有日志。

设置

安装

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

配置

morgan-logging.js

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

app.use(morgan(ecsFormat(/* options */)));  // 1

// ...
app.get('/', function (req, res) {
  res.send('hello, world!');
})
app.listen(3000);
  • 将 ECS 格式化程序传递给 morgan()。

配置 Filebeat

收集 ECS 格式化的日志的最佳方式是使用 Filebeat:

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: # 5
  - add_host_metadata: ~
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
  1. 使用文件流输入从活动日志文件中读取行。
  2. 如果发生冲突,解码的 JSON 对象的值将覆盖 Filebeat 通常添加的字段(type、source、offset 等)。
  3. 如果发生 JSON 解组错误,Filebeat 将添加 “error.message” 和 “error.type: json” 键。
  4. Filebeat 将递归地从解码的 JSON 中去掉点键,并将其扩展为分层对象结构。
  5. 处理器可增强您的数据。请参阅 processor 以了解更多信息。

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 参考。

使用方法

morgan-logging.js

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

app.use(morgan(ecsFormat(/* options */)));  // 1

app.get('/', function (req, res) {
  res.send('hello, world!');
})
app.get('/error', function (req, res, next) {
  next(new Error('boom'));
})

app.listen(3000)
  1. 请参阅下面的可用选项。

运行上面的应用,并访问 http://localhost:3000。

npm install express
$ pwd
/Users/liuxg/nodejs/nodejs-logs
$ ls
morgan-logging.js  pino-logging.js    winston-logging.js
$ node morgan-logging.js | jq .

运行此脚本(完整示例在这里)并发出请求(通过 curl -i localhost:3000/)将产生类似于以上内容的日志输出。

Format 选项

你可以传递任何通常传递给 morgan() 的格式参数,日志 “message” 字段将使用指定的格式。默认为 combined。

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

app.use(morgan(ecsFormat({ format: 'tiny' })));  // 1
// ...
  1. 如果 “format” 是你使用的唯一选项,你可以将其作为 ecsFormat('tiny') 传递。

log.level

如果响应代码 >= 500,log.level 字段将为 “error”,否则为 “info”。例如,再次运行 examples/express.js,curl -i localhost:3000/error 将产生:

% node examples/express.js | jq .
{
  "@timestamp": "2021-01-18T17:52:12.810Z",
  "log.level": "error",
  "message": "::1 - - [18/Jan/2021:17:52:12 +0000] \"GET /error HTTP/1.1\" 500 1416 \"-\" \"curl/7.64.1\"",
  "http": {
    "response": {
      "status_code": 500,
  ...

使用 APM 进行日志关联

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

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

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

% node examples/express-with-apm.js | jq .
{
  // The same fields as before, plus:
  "service.name": "express-with-elastic-apm",
  "service.version": "1.1.0",
  "service.environment": "development",
  "event.dataset": "express-with-elastic-apm",
  "trace.id": "116d46f667a7600deed9c41fa015f7de",
  "transaction.id": "b84fb72d7bf42866"
}

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

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

app.use(morgan(ecsFormat({ apmIntegration: false })));

参考

ecsFormat([options])

  • options {type-object} 支持以下选项:
    • format {type-string} 格式名称(例如 combined)、格式函数(例如 morgan.combined)或格式字符串(例如 :method :url :status)。这用于格式化“message”字段。默认值 morgan.combined。
    • convertErr {type-boolean} 是否将记录的错误字段转换为 ECS 错误字段。默认值:true。
    • 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} 的默认设置。

为 morgan 创建以 ECS 日志记录格式发出的格式化程序。

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

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

相关文章

无法找到模块“@wangeditor/editor-for-vue”的声明文件

vue3项目中使用wangeditor/editor遇到的问题 开发环境不管红线报错正常使用 打包的时候就会报错了 1.安装依赖 pnpm install --save wangeditor/editor wangeditor/editor-for-vuenext 2.遇到的问题 3.解决方法 在src目录下面创建 wangeditor-types.d.ts 文件 代码如下 de…

【单片机毕业设计选题24054】-基于STM32的水质检测系统

系统功能: 主要功能模块原理图: 电源时钟烧录接口: 单片机和按键输入电路: 传感器采集电路&#xff1a; 资料获取地址 系统主要功能模块代码 初始化代码: /* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration-----------------------------------------------…

最大数值00

题目链接 最大数值 题目描述 注意点 不得使用if-else或其他比较运算符 解答思路 本题直接比较大小非常简单&#xff0c;但是题目要求不得使用if-else或其他比较运算符&#xff0c;可以先将a与b相减&#xff0c;再右移获得其符号位&#xff0c;根据符号位是0还是-1返回相应…

【以史为镜、以史明志,知史爱党、知史爱国】中华上下五千年之-唐朝

唐朝&#xff08;618年—907年&#xff09;&#xff0c;是继隋朝之后的大一统中原王朝&#xff0c;共历二十一帝&#xff0c;享国二百八十九年。 隋末天下群雄并起&#xff0c;617年 唐国公李渊于晋阳起兵&#xff0c;次年称帝建立唐朝&#xff0c;定都长安。 唐太宗继位后开创…

【吊打面试官系列-MyBatis面试题】简述 Mybatis 的插件运行原理,以及如何编写一个插件?

大家好&#xff0c;我是锋哥。今天分享关于 【简述 Mybatis 的插件运行原理&#xff0c;以及如何编写一个插件?】面试题&#xff0c;希望对大家有帮助&#xff1b; 简述 Mybatis 的插件运行原理&#xff0c;以及如何编写一个插件? Mybatis 仅可以编写针对 ParameterHandler、…

About CAT7验证——CLASS F或者Fa测试FLUKE解决方案

七类CLASS F线缆认证测试标准在TIA的标准数据库中是直接跳过&#xff0c;取而代之的是八类的通道测试标准&#xff0c;真正认证七类测试的是在ISO标准数据库中&#xff0c;找到ISO11801 CHANNEL CLASS F或者FA&#xff0c;这就是标准的七类测试标准&#xff0c;测试频率需要达到…

【以史为镜、以史明志,知史爱党、知史爱国】中华上下五千年之-隋朝

隋朝&#xff08;581年-619年&#xff09;是中国历史上承南北朝、下启唐朝的大一统王朝。 581年&#xff0c;杨坚定国号为“隋”&#xff0c;定都大兴城&#xff0c;随后南下灭陈朝&#xff0c;统一中国&#xff0c;结束了自西晋末年以来长达近300年的分裂局面。 杨坚&#xff…

在树莓派设备上导出系统镜像

镜像导出 前提条件&#xff1a; 已获取可以正常使用的设备。已获取鼠标、键盘和电源适配器。已将设备接入可正常使用的网络。 操作步骤&#xff1a; 连接适配器给设备上电&#xff0c;正常启动设备&#xff0c;连接鼠标和键盘。在终端命令窗格执行如下命令&#xff0c;安装…

您的《嵌入式系统设计中级工程师》证书待领取,点击查看!

在技术日新月异的今天&#xff0c;每一份专业认证都是个人专业能力的有力证明。近期&#xff0c;中国电子学会新一轮《嵌入式系统设计中级工程师-嵌入式裸机编程》专业技术证书的相关认证考试已圆满结束&#xff0c;最新一批证书已全部发放&#xff01; ▋ 证书介绍 嵌入式技术…

ES6:JavaScript开发者的速成手册(二)

目录 前言Reflect APIProxyProxy 与 defineProperty 的区别 SymbolsGeneratorsgenerator处理异步代码 PromiseAsyncModuleAPI介绍 前言 本教程将分为两大部分深入解读ES6的精髓。将带你领略ES6的基础语法&#xff0c;将深入探讨ES6的高级特性&#xff0c;通过浅显易懂的语言和大…

视频压缩文件太大了怎么缩小?3个压缩方法分享

视频压缩文件太大了怎么缩小&#xff1f;当视频压缩文件过大时&#xff0c;缩小其大小不仅能节省宝贵的存储空间&#xff0c;还能显著提升文件传输速度&#xff0c;特别是在网络条件有限的情况下。通过专业的视频压缩软件&#xff0c;可以有效减少文件体积&#xff0c;使视频内…

五分钟带你学会Vant 4的使用

前言 本章将从零开始讲解vant组件库的使用方法 对小白极其友好&#xff0c;主打的就是一个读者就是上帝&#xff0c;你只管张嘴&#xff0c;我把饭嚼碎了喂给你&#xff08;坏笑&#xff09; 那我们就直接开始吧&#xff01;&#xff01;&#xff01; 效果展示 登录页面展…

多会话 Telnet 日志记录器

创建一个多会话 Telnet 日志记录器可以实现对多个 Telnet 会话进行连接、监控和记录日志。以下是一个基本的 Python 示例&#xff0c;使用 telnetlib 库来实现多会话 Telnet 日志记录器&#xff0c;并使用 threading 模块来处理多个会话。 1、问题背景 我们需要编写一个脚本&a…

一天20MW!天途推出无人机全自主光伏巡检平台

01 光伏电站的运维挑战 光伏发电为人类提供了可持续的清洁能源供给。一般集中式电站建设在空旷的地区&#xff0c;如荒地、沙漠等地区&#xff1b;分布式电站建设在用户的屋顶和建筑物表面&#xff0c;如住宅、商业建筑、工业厂房等地区。 随着光伏电站的大规模的使用&#x…

昇思25天学习打卡营第十七天|文本解码原理--以MindNLP为例

背景 提供免费算力支持&#xff0c;有交流群有值班教师答疑的华为昇思训练营进入第十七天了。 今天是第十七天&#xff0c;从第十天开始&#xff0c;进入了应用实战阶段&#xff0c;前九天都是基础入门阶段&#xff0c;具体的学习内容可以看链接 基础学习部分 昇思25天学习打卡…

IF不降反增!审稿速度,比我家网速还快!3本接受率高的医学期刊,赶紧码住!

&#x1f50d; 为什么选择这3本期刊&#xff1f; 今天老毕给大家分享3本医学 SCI&#xff0c;分别为Tumori Journal、Adipocyte以及Annals of Medicine。 这3本医学杂志&#xff0c;不仅审稿速度快&#xff0c;录用率还高&#xff0c;其中不乏接受率为48%的“毕业神刊”。2024年…

3D问界—ZBrush最新版本中的旋转Local按钮哪儿去哪儿?

问题提出&#xff1a;ZBrush最新版本中的Local按钮哪儿去哪儿&#xff1f; 目前我使用的是Zbrush2024.0.1版本&#xff0c;但是当我想要取消锁定局部旋转的时候死活找不到local功能。 1. 注意&#xff1a;Local功能挪到这里了 2. 关于local功能的使用&#xff08;Local Trans…

Flink ui 本地flink ui 报错 {“errors“:[“Not found: /“]}

在学习flink 的过程中&#xff0c;伊始的flink 版本是1.17.2 报题目的错误 &#xff0c;百思不得其解&#xff0c;尝试更替了1.19.1 然后就成功了 &#xff0c;期间未做任何的修改 。 ui 默认地址 &#xff1a; http://localhost:8081 pom 文件 如下 <?xml version&qu…

Vue 3 与 TypeScript:最佳实践详解

大家好,我是CodeQi! 很多人问我为什么要用TypeScript? 因为 Vue3 喜欢它! 开个玩笑... 在我们开始探索 Vue 3 和 TypeScript 最佳实践之前,让我们先打个比方。 如果你曾经尝试过在没有 GPS 的情况下开车到一个陌生的地方,你可能会知道那种迷失方向的感觉。 而 Typ…

clean code-代码整洁之道 阅读笔记(第十七章 终章)

大纲 第十七章 味道与启发 17.1 注释 C1&#xff1a;不恰当的信息 C2&#xff1a;废弃的注释 C3&#xff1a;冗余注释 C4&#xff1a;糟糕的注释 C5&#xff1a;注释掉的代码 17.2 环境 E1&#xff1a;需要多步才能实现的构建 E2&#xff1a;需要多步才能做到的测试 …