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

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

这是之前系列文章:

  • 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   # 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. 使用文件流输入从活动日志文件中读取行。
  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: 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 参考。

使用方法

morgan-logging.js

const app = require('express')();
const morgan = require('morgan');
const { ecsFormat } = require('@elastic/ecs-morgan-format');app.use(morgan(ecsFormat(/* options */)));  // 1app.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 日志记录格式发出的格式化程序。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【全面介绍语言模型的原理,实战和评估】
  • 使用Python绘制气泡图
  • 共话未来 | 人大金仓即将亮相TDBC 2024可信数据库发展大会
  • linux_进程概念——理解冯诺依曼体系结构
  • C基础day8
  • 微软推出全新的学习网站 Microsoft Learn
  • wifi模组Ai-M62-32S的IO映射和UDP透传测试
  • LAZYNVIM学习使用笔记
  • 构造函数语意学(The Semantics of Constructors)
  • Mybatis之动态sql、缓存、分页、配置数据源
  • 防御笔记第四天(持续更新)
  • 最优化(10):牛顿类、拟牛顿类算法
  • 百日筑基第十七天-消息队列入门
  • Linux驱动开发-03字符设备驱动框架搭建
  • 阿里云通义千问开源两款语音基座模型分别是SenseVoice和CosyVoice
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • CentOS7 安装JDK
  • Debian下无root权限使用Python访问Oracle
  • Docker入门(二) - Dockerfile
  • gf框架之分页模块(五) - 自定义分页
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • js 实现textarea输入字数提示
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 从PHP迁移至Golang - 基础篇
  • 开源地图数据可视化库——mapnik
  • 设计模式 开闭原则
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 想写好前端,先练好内功
  • 异步
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (LLM) 很笨
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (五)网络优化与超参数选择--九五小庞
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)关于多人操作数据的处理策略
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .htaccess 强制https 单独排除某个目录
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET COER+CONSUL微服务项目在CENTOS环境下的部署实践
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • @JSONField或@JsonProperty注解使用
  • @ModelAttribute使用详解
  • @Slf4j idea标红Cannot resolve symbol ‘log‘
  • [ C++ ] 继承
  • [ JavaScript ] JSON方法
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [Android]常见的数据传递方式
  • [Android实例] 保持屏幕长亮的两种方法 [转]