Elasticsearch:Node.js ECS 日志记录 - Morgan
这是之前系列文章:
中的第三篇文章。在今天的文章中,我将描述如何使用 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: ~
- 使用文件流输入从活动日志文件中读取行。
- 如果发生冲突,解码的 JSON 对象的值将覆盖 Filebeat 通常添加的字段(type、source、offset 等)。
- 如果发生 JSON 解组错误,Filebeat 将添加 “error.message” 和 “error.type: json” 键。
- Filebeat 将递归地从解码的 JSON 中去掉点键,并将其扩展为分层对象结构。
- 处理器可增强您的数据。请参阅 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)
- 请参阅下面的可用选项。
运行上面的应用,并访问 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 // ...
- 如果 “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 日志记录格式发出的格式化程序。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
电子表格转身购物车:三步轻松实现
在我们的项目当中,经常需要添加一些选择界面,让用户直观地进行交互,比如耗材、办公用品、设计稿或者其它可以选择的内容。 在线商城的商品目录和购物车无疑是一种大家都很熟悉的交互方式,但是在实际开发中,我们可能会遇到以下几个问题: 怎么及时响应产品的需求,快速实现功能上线? 怎样实现灵活变更模板,把数据、模板和实现分离,便于设计同学随时修改UI? 怎样让用户获得熟悉的交互体验,同时实现前端数据收集和统计? 这里给大家提供一个思路,用在线Excel来实现这个功能!本文将展示如何使用纯前端表格控件,在30分钟内、三步操作创建产品目录页和购物车效果。文末包含demo源码,不要错过。 先来看看完成的效果: 简单三步创建个性化产品目录页 除了支持数百种统计和财务功能的高速计算引擎外,我们还将大量使用SpreadJS内置的 RANGEBLOCKSPARKLINE(template_range, data_expr) - 一个强大的迷你图功能,允许用户将单元格范围模板 (template_range) 定义为单个单元格类型并将该模板应用于单元格以将一组数据(data_expr)加载到模板中。 点击此处下载...
- 下一篇
RXThinkCMF 敏捷开发框架 ThinkPhp8+EleVue 版本 v2.2.0 发布
v2.2.0 更新内容: 1、新增导入Excel数据功能; 2、新增导出Excel数据功能; 3、修复近期用户反馈的问题; 项目介绍 一款 PHP 语言基于 ThinkPhp8、Vue、ElementUI、MySQL 等框架精心打造的一款模块化、插件化、高性能的前后端分离架构敏捷开发框架,可用于快速搭建前后端分离后台管理系统,本着简化开发、提升开发效率的初衷,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架,框架已集成了完整的 RBAC 权限架构和常规基础模块,同时支持多主题切换,可以根据自己喜欢的风格选择想一个的主题,实现了个性化呈现的需求;为了敏捷快速开发,提升研发效率,框架内置了一键 CRUD 代码生成器,自定义了模块生成模板,可以根据已建好的表结构 (字段注释需规范) 快速的一键生成整个模块的所有代码和增删改查等等功能业务,真正实现了低代码开发,极大的节省了人力成本的同时提高了开发效率,缩短了研发周期,是一款真正意义上实现组件...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2配置默认Tomcat设置,开启更多高级功能