获取当前脚本的控制台输出

时间:2019-01-27 15:02:04

标签: node.js

我想获取当前正在运行的Node.js脚本的控制台内容。

我已经尝试过进行此活动,但是它不起作用:

setInterval(function() { console.log("Hello World!") }, 1000);

process.stdout.on('message', (message) => {
    console.log('stdout: ' + message.toString())
})

它不监听事件。

3 个答案:

答案 0 :(得分:1)

process.stdout上没有“邮件”事件。

  

我想在名为/ getconsole的Express.js应用中进行GET。   应该返回当前正在运行的Node.js脚本的控制台(其中   也正在运行Express.js应用)

您应该使用的是自定义记录器,我建议使用winston进行文件传输,然后在向端点发出请求时可以从该文件读取。

const express = require('express');
const fs = require('fs');
const winston = require('winston');
const path = require('path');

const logFile = path.join(__dirname, 'out.log');
const app = express();

const logger = winston.createLogger({
    level: 'info',
    format: winston.format.json(),
    transports: [
        new winston.transports.Console({
            format: winston.format.simple()
        }),
        new winston.transports.File({
            filename: logFile
        })
    ]
});


// Don't use console.log anymore.
logger.info('Hi');


app.get('/console', (req, res) => {
    // Secure this endpoint somehow
    fs.createReadStream(logFile)
        .pipe(res);
});

app.get('/log', (req, res) => {
    logger.info('Log: ' + req.query.message);
});

app.listen(3000);

您还可以使用websocket连接,并创建自定义的winston传输来发出日志。

答案 1 :(得分:1)

这不是完全的Node.js解决方案,但是如果您运行Linux,则非常好。

  1. 创建一个start.sh文件。

  2. 将以下内容放入其中:

start.sh

#!/bin/bash
touch ./console.txt
node ./MyScript.js |& tee console.txt &

wait
  1. 现在打开您的Node.js脚本(MyScript.js)并使用此Express.js事件:

MyScript.js

const fs = require('fs');
app.get('/console', function(req, res){
    var console2 = fs.readFileSync("./console.txt", 'utf8');
    res.send(console2);
});
  1. 始终通过调用start.sh
  2. 来启动Node.js应用程序

现在调用http://example.com/console应该会输出控制台!

  • 使用了this answer的一部分。

  • 注意:要格式化控制台输出的换行符以使其在浏览器中正确显示,可以使用nl2br之类的模块。

  • 建议:问题并非总是以直接方式解决,大多数问题是通过间接方式解决的。不断寻找实现自己想要的东西的可能方法,而不仅仅是寻找自己想要的东西。

答案 2 :(得分:0)

stdout,在进入tty(终端)时是writable stream的实例。 stderr也是如此,节点向其写入错误消息。这些流没有消息事件。 on()方法允许请求任何已命名的事件,甚至那些永不触发的事件。

您的问题不清楚。如果要拦截和检查console.log操作,则可以将stdout通过管道传输到其他流。同样,您可以将stderr传递到其他流以拦截和检查错误。

或者,由于一时的丑陋和可维护性差,您可以将console.log和console.error函数重新定义为满足您需要的功能。

听起来您想缓冲写入控制台的资料,然后将其返回给http客户端以响应GET操作。为此,您要么

  1. 停止为该输出使用console.log,并切换到高质量的npm日志记录软件包,例如winston。

  2. 重新定义console.log(可能还有console.error),以将其输出保存在某种简单的express-app-scope数据结构中,也许是字符串数组。然后实施GET来读取该字符串数组,对其进行格式化,然后将其返回。

我的第一个建议是更具扩展性。

顺便说一句,请考虑使控制台日志可供恶意陌生人使用的安全隐患。