如何在没有环境变量的情况下启用NODE_DEBUG?
How to enable NODE_DEBUG without environment variables?
我正在尝试调试 AWS Lambda 环境 (Node.js 4.3) 中 运行 时 node.js https 库环境中出现的套接字错误。此问题只会高度间歇性地发生,并且只会在重负载下发生。我的团队已经能够通过负载测试一致地重现该问题,我们希望从 https 模块启用调试日志记录。
我在节点文档中发现我可以通过设置 NODE_DEBUG=https
环境变量来启用调试日志记录。但是,我不相信我可以设置环境变量:How can I use environmental variables on AWS Lambda?。此外,我无法更改 Lambda 用于调用我的函数的命令行。
是否有另一种方法来创建与设置 NODE_DEBUG
相同的调试日志记录?
我不熟悉 Aws Lambda,但也许您仍然可以像下面这样在命令中导出变量:
NODE_DEBUG=https node app.js
运行 以下:
node app.js --https-debug
在你的 app.js 脚本的开头有这个
process.argv.forEach((val, index) => {
if(val.match(/--https-debug/)) {
process.env.NODE_DEBUG = "https";
}
});
process.env 是一个对象,就像任何对象一样,但是节点在其上设置了环境变量,您总是可以 hack 它并覆盖从节点设置的任何变量全球环境。
我们使用 process.argv 来捕获终端中发送到节点 js 文件的所有参数。
child_process.fork() 允许一个模块生成具有指定环境变量的新节点环境。这两个进程可以通过 send()
相互发送消息,并通过 'message' 事件接收这些消息。
例如,如果您当前的主模块名为 server.js
,那么您可以在同一目录中添加一个临时的 start.js
模块(这将是新的 lambda 函数),如下所示这个:
// Add NODE_DEBUG to this process's environment variables, which are passed by default to
// the forked node environment.
process.env.NODE_DEBUG = 'https';
const cp = require('child_process');
const n = cp.fork('server.js');
// Cached callback functions, in case client can pass in different callbacks.
// Use an object instead of array, to avoid memory leaks.
const cbs = {};
var cbIndexCounter = 0; // To make callback indices unique
// Call appropriate callback with response from child process, and delete cached callback.
n.on('message', (m) => {
cbs[m.cbIndex](m.error, m.result);
delete cbs[m.cbIndex];
});
n.on('error', (err) => {
console.log('Child node env error: ', err);
});
// Cache the callback; forward event, context, index to child process; and increment index.
exports.myHandler = function(event, context, callback) {
cbs[cbIndexCounter] = callback;
n.send({
event: event,
context: context,
cbIndex: cbIndexCounter++
});
}
server.js
模块可以通过添加 'message' 事件侦听器来稍微修改:
process.on('message', (m) => {
exports.myHandler(m.event, m.context, function(error, result) {
process.send({
error: error,
result: result,
cbIndex: m.cbIndex
});
});
});
// The rest of your original code ...
exports.myHandler = function (event, context, callback) {
// Whatever you need here...
}
这是一个猴子补丁:
const util = require('util');
let debuglog = util.debuglog;
util.debuglog = set => {
if (set === 'https') {
let pid = process.pid;
return function() {
let msg = util.format.apply(util, arguments);
console.error('%s %d: %s', set, pid, msg);
}
}
return debuglog(set);
}
// This has to occur _after_ the code above:
const https = require('https');
它基本上为 https
启用调试日志记录,而不考虑 $NODE_DEBUG
。轻松重写以适用于任何模块,使用 Node v4 和 v6 进行测试。
我正在尝试调试 AWS Lambda 环境 (Node.js 4.3) 中 运行 时 node.js https 库环境中出现的套接字错误。此问题只会高度间歇性地发生,并且只会在重负载下发生。我的团队已经能够通过负载测试一致地重现该问题,我们希望从 https 模块启用调试日志记录。
我在节点文档中发现我可以通过设置 NODE_DEBUG=https
环境变量来启用调试日志记录。但是,我不相信我可以设置环境变量:How can I use environmental variables on AWS Lambda?。此外,我无法更改 Lambda 用于调用我的函数的命令行。
是否有另一种方法来创建与设置 NODE_DEBUG
相同的调试日志记录?
我不熟悉 Aws Lambda,但也许您仍然可以像下面这样在命令中导出变量:
NODE_DEBUG=https node app.js
运行 以下:
node app.js --https-debug
在你的 app.js 脚本的开头有这个
process.argv.forEach((val, index) => {
if(val.match(/--https-debug/)) {
process.env.NODE_DEBUG = "https";
}
});
process.env 是一个对象,就像任何对象一样,但是节点在其上设置了环境变量,您总是可以 hack 它并覆盖从节点设置的任何变量全球环境。
我们使用 process.argv 来捕获终端中发送到节点 js 文件的所有参数。
child_process.fork() 允许一个模块生成具有指定环境变量的新节点环境。这两个进程可以通过 send()
相互发送消息,并通过 'message' 事件接收这些消息。
例如,如果您当前的主模块名为 server.js
,那么您可以在同一目录中添加一个临时的 start.js
模块(这将是新的 lambda 函数),如下所示这个:
// Add NODE_DEBUG to this process's environment variables, which are passed by default to
// the forked node environment.
process.env.NODE_DEBUG = 'https';
const cp = require('child_process');
const n = cp.fork('server.js');
// Cached callback functions, in case client can pass in different callbacks.
// Use an object instead of array, to avoid memory leaks.
const cbs = {};
var cbIndexCounter = 0; // To make callback indices unique
// Call appropriate callback with response from child process, and delete cached callback.
n.on('message', (m) => {
cbs[m.cbIndex](m.error, m.result);
delete cbs[m.cbIndex];
});
n.on('error', (err) => {
console.log('Child node env error: ', err);
});
// Cache the callback; forward event, context, index to child process; and increment index.
exports.myHandler = function(event, context, callback) {
cbs[cbIndexCounter] = callback;
n.send({
event: event,
context: context,
cbIndex: cbIndexCounter++
});
}
server.js
模块可以通过添加 'message' 事件侦听器来稍微修改:
process.on('message', (m) => {
exports.myHandler(m.event, m.context, function(error, result) {
process.send({
error: error,
result: result,
cbIndex: m.cbIndex
});
});
});
// The rest of your original code ...
exports.myHandler = function (event, context, callback) {
// Whatever you need here...
}
这是一个猴子补丁:
const util = require('util');
let debuglog = util.debuglog;
util.debuglog = set => {
if (set === 'https') {
let pid = process.pid;
return function() {
let msg = util.format.apply(util, arguments);
console.error('%s %d: %s', set, pid, msg);
}
}
return debuglog(set);
}
// This has to occur _after_ the code above:
const https = require('https');
它基本上为 https
启用调试日志记录,而不考虑 $NODE_DEBUG
。轻松重写以适用于任何模块,使用 Node v4 和 v6 进行测试。