Node.js v25.0.0 文档
- Node.js v25.0.0
- 目录
-
索引
- 断言测试
- 异步上下文跟踪
- 异步钩子
- 缓冲区
- C++ 插件
- 使用 Node-API 的 C/C++ 插件
- C++ 嵌入器 API
- 子进程
- 集群
- 命令行选项
- 控制台
- 加密
- 调试器
- 已弃用的 API
- 诊断通道
- DNS
- 域
- 环境变量
- 错误
- 事件
- 文件系统
- 全局对象
- HTTP
- HTTP/2
- HTTPS
- 检查器
- 国际化
- 模块:CommonJS 模块
- 模块:ECMAScript 模块
- 模块:
node:module
API - 模块:包
- 模块:TypeScript
- 网络
- 操作系统
- 路径
- 性能钩子
- 权限
- 进程
- Punycode
- 查询字符串
- 逐行读取
- REPL
- 报告
- 单一可执行文件应用
- SQLite
- 流
- 字符串解码器
- 测试运行器
- 定时器
- TLS/SSL
- 跟踪事件
- TTY
- UDP/数据报
- URL
- 实用工具
- V8
- 虚拟机
- WASI
- Web Crypto API
- Web Streams API
- 工作线程
- Zlib
- 其他版本
- 选项
跟踪事件#
源代码: lib/trace_events.js
node:trace_events
模块提供了一种机制,用于集中处理由 V8、Node.js 核心和用户空间代码生成的跟踪信息。
可以通过 --trace-event-categories
命令行标志或使用 node:trace_events
模块来启用跟踪。--trace-event-categories
标志接受一个以逗号分隔的类别名称列表。
可用的类别有:
node
:一个空的占位符。node.async_hooks
:启用捕获详细的async_hooks
跟踪数据。async_hooks
事件有一个唯一的asyncId
和一个特殊的triggerId
triggerAsyncId
属性。node.bootstrap
:启用捕获 Node.js 启动过程中的里程碑事件。node.console
:启用捕获console.time()
和console.count()
的输出。node.threadpoolwork.sync
:启用捕获线程池同步操作的跟踪数据,例如blob
、zlib
、crypto
和node_api
。node.threadpoolwork.async
:启用捕获线程池异步操作的跟踪数据,例如blob
、zlib
、crypto
和node_api
。node.dns.native
:启用捕获 DNS 查询的跟踪数据。node.net.native
:启用捕获网络相关的跟踪数据。node.environment
:启用捕获 Node.js 环境的里程碑事件。node.fs.sync
:启用捕获文件系统同步方法的跟踪数据。node.fs_dir.sync
:启用捕获文件系统同步目录方法的跟踪数据。node.fs.async
:启用捕获文件系统异步方法的跟踪数据。node.fs_dir.async
:启用捕获文件系统异步目录方法的跟踪数据。node.perf
:启用捕获 Performance API 的测量数据。node.perf.usertiming
:仅启用捕获 Performance API 的用户计时(User Timing)测量和标记。node.perf.timerify
:仅启用捕获 Performance API 的 timerify 测量数据。
node.promises.rejections
:启用捕获跟踪未处理的 Promise rejection 和之后被处理的 rejection 数量的跟踪数据。node.vm.script
:启用捕获node:vm
模块的runInNewContext()
、runInContext()
和runInThisContext()
方法的跟踪数据。v8
:V8 事件与垃圾回收(GC)、编译和执行相关。node.http
:启用捕获 http 请求/响应的跟踪数据。node.module_timer
:启用捕获 CJS 模块加载的跟踪数据。
默认情况下,node
、node.async_hooks
和 v8
类别是启用的。
node --trace-event-categories v8,node,node.async_hooks server.js
旧版本的 Node.js 需要使用 --trace-events-enabled
标志来启用跟踪事件。这个要求已被移除。但是,--trace-events-enabled
标志仍可使用,并且默认会启用 node
、node.async_hooks
和 v8
跟踪事件类别。
node --trace-events-enabled
# is equivalent to
node --trace-event-categories v8,node,node.async_hooks
另外,也可以使用 node:trace_events
模块来启用跟踪事件:
import { createTracing } from 'node:trace_events';
const tracing = createTracing({ categories: ['node.perf'] });
tracing.enable(); // Enable trace event capture for the 'node.perf' category
// do work
tracing.disable(); // Disable trace event capture for the 'node.perf' category
const { createTracing } = require('node:trace_events');
const tracing = createTracing({ categories: ['node.perf'] });
tracing.enable(); // Enable trace event capture for the 'node.perf' category
// do work
tracing.disable(); // Disable trace event capture for the 'node.perf' category
在启用跟踪的情况下运行 Node.js 会产生日志文件,这些文件可以在 Chrome 的 chrome://tracing
标签页中打开。
日志文件默认名为 node_trace.${rotation}.log
,其中 ${rotation}
是一个递增的日志轮转 ID。文件路径模式可以通过 --trace-event-file-pattern
指定,它接受一个支持 ${rotation}
和 ${pid}
的模板字符串。
node --trace-event-categories v8 --trace-event-file-pattern '${pid}-${rotation}.log' server.js
为了确保在收到如 SIGINT
、SIGTERM
或 SIGBREAK
等信号事件后能正确生成日志文件,请确保在你的代码中有适当的处理程序,例如:
process.on('SIGINT', function onSigint() {
console.info('Received SIGINT.');
process.exit(130); // Or applicable exit code depending on OS and signal
});
跟踪系统使用与 process.hrtime()
相同的时间源。然而,跟踪事件的时间戳是以微秒表示的,而 process.hrtime()
返回的是纳秒。
此模块的功能在 Worker
线程中不可用。
node:trace_events
模块#
Tracing
对象#
Tracing
对象用于为一组类别启用或禁用跟踪。实例通过 trace_events.createTracing()
方法创建。
创建时,Tracing
对象是禁用的。调用 tracing.enable()
方法会将这些类别添加到已启用的跟踪事件类别集合中。调用 tracing.disable()
方法会从已启用的跟踪事件类别集合中移除这些类别。
tracing.disable()
#
禁用此 Tracing
对象。
只有那些不被其他已启用的 Tracing
对象覆盖,并且未通过 --trace-event-categories
标志指定的跟踪事件类别才会被禁用。
import { createTracing, getEnabledCategories } from 'node:trace_events';
const t1 = createTracing({ categories: ['node', 'v8'] });
const t2 = createTracing({ categories: ['node.perf', 'node'] });
t1.enable();
t2.enable();
// Prints 'node,node.perf,v8'
console.log(getEnabledCategories());
t2.disable(); // Will only disable emission of the 'node.perf' category
// Prints 'node,v8'
console.log(getEnabledCategories());
const { createTracing, getEnabledCategories } = require('node:trace_events');
const t1 = createTracing({ categories: ['node', 'v8'] });
const t2 = createTracing({ categories: ['node.perf', 'node'] });
t1.enable();
t2.enable();
// Prints 'node,node.perf,v8'
console.log(getEnabledCategories());
t2.disable(); // Will only disable emission of the 'node.perf' category
// Prints 'node,v8'
console.log(getEnabledCategories());
tracing.enable()
#
为此 Tracing
对象所覆盖的类别集合启用该对象。
trace_events.createTracing(options)
#
options
<Object>categories
<string[]> 一个包含跟踪类别名称的数组。数组中的值如果可能的话会被强制转换为字符串。如果值无法被转换,则会抛出错误。
- 返回:<Tracing>。
为给定的 categories
集合创建并返回一个 Tracing
对象。
import { createTracing } from 'node:trace_events';
const categories = ['node.perf', 'node.async_hooks'];
const tracing = createTracing({ categories });
tracing.enable();
// do stuff
tracing.disable();
const { createTracing } = require('node:trace_events');
const categories = ['node.perf', 'node.async_hooks'];
const tracing = createTracing({ categories });
tracing.enable();
// do stuff
tracing.disable();
trace_events.getEnabledCategories()
#
- 返回: <string>
返回一个以逗号分隔的列表,包含当前所有已启用的跟踪事件类别。当前已启用的跟踪事件类别集合是由所有当前已启用的 Tracing
对象和通过 --trace-event-categories
标志启用的任何类别的并集决定的。
给定下面的文件 test.js
,命令 node --trace-event-categories node.perf test.js
将会在控制台打印 'node.async_hooks,node.perf'
。
import { createTracing, getEnabledCategories } from 'node:trace_events';
const t1 = createTracing({ categories: ['node.async_hooks'] });
const t2 = createTracing({ categories: ['node.perf'] });
const t3 = createTracing({ categories: ['v8'] });
t1.enable();
t2.enable();
console.log(getEnabledCategories());
const { createTracing, getEnabledCategories } = require('node:trace_events');
const t1 = createTracing({ categories: ['node.async_hooks'] });
const t2 = createTracing({ categories: ['node.perf'] });
const t3 = createTracing({ categories: ['v8'] });
t1.enable();
t2.enable();
console.log(getEnabledCategories());
示例#
通过 inspector 收集跟踪事件数据#
import { Session } from 'node:inspector';
const session = new Session();
session.connect();
function post(message, data) {
return new Promise((resolve, reject) => {
session.post(message, data, (err, result) => {
if (err)
reject(new Error(JSON.stringify(err)));
else
resolve(result);
});
});
}
async function collect() {
const data = [];
session.on('NodeTracing.dataCollected', (chunk) => data.push(chunk));
session.on('NodeTracing.tracingComplete', () => {
// done
});
const traceConfig = { includedCategories: ['v8'] };
await post('NodeTracing.start', { traceConfig });
// do something
setTimeout(() => {
post('NodeTracing.stop').then(() => {
session.disconnect();
console.log(data);
});
}, 1000);
}
collect();
'use strict';
const { Session } = require('node:inspector');
const session = new Session();
session.connect();
function post(message, data) {
return new Promise((resolve, reject) => {
session.post(message, data, (err, result) => {
if (err)
reject(new Error(JSON.stringify(err)));
else
resolve(result);
});
});
}
async function collect() {
const data = [];
session.on('NodeTracing.dataCollected', (chunk) => data.push(chunk));
session.on('NodeTracing.tracingComplete', () => {
// done
});
const traceConfig = { includedCategories: ['v8'] };
await post('NodeTracing.start', { traceConfig });
// do something
setTimeout(() => {
post('NodeTracing.stop').then(() => {
session.disconnect();
console.log(data);
});
}, 1000);
}
collect();