修改发送给节点检查员的日志消息

时间:2018-04-14 12:53:27

标签: node.js google-chrome-devtools

是否可以拦截和修改发送给连接节点检查员的消息/ websockets(console.log/error调用)(即chrome的devTools)?

想法是将更多内容记录到节点检查员,而不是将基本消息记录到基本tty。此外,devTools不支持tty颜色转义码(例如来自chalk包),反之亦然,它不支持devTools' console.log('%c', 'color: red')个样式。

或者,是否可以列出连接到当前节点进程的websocket客户端以查看是否已连接devTools检查器,因此假设我们使用 进行调试,因此我们可以以不同方式进行日志记录? http://localhost:9229/json/list并不是很有用(如果它应该是这样的话)。

1 个答案:

答案 0 :(得分:0)

我们可以利用console.log/error使用process.stdout写入终端的事实。因此,如果我们只想向检查员发送消息,而不是将其写入终端,我们可以通过覆盖它来暂时禁用stdout

// inspector-only loggers
// -------------------------------------------------------------------------

const _stdoutWrite = process.stdout.write;
const _stderrWrite = process.stderr.write;

console.inspector = {};

[ "log", "warn", "error", "info" ].forEach( method => {

    const origLogger = console[method].bind( console );

    console.inspector[method] = ( ...args ) => {

        process.stdout.write = () => {};
        process.stderr.write = () => {};
        origLogger( ...args );
        process.stdout.write = _stdoutWrite;
        process.stderr.write = _stderrWrite;
    };    
});

同样,如果我们只想登录终端而不登录检查员,我们可以直接使用process.stdout

// terminal-only logger
// -------------------------------------------------------------------------

console.tty = ( ...args ) => {
    args = args.reduce((a, b) => String(a) + " " + String(b), "" ).trim();
    process.stdout.write( args + "\n" );
}