我想获取当前正在运行的Node.js脚本的控制台内容。
我已经尝试过进行此活动,但是它不起作用:
setInterval(function() { console.log("Hello World!") }, 1000);
process.stdout.on('message', (message) => {
console.log('stdout: ' + message.toString())
})
它不监听事件。
答案 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,则非常好。
创建一个start.sh
文件。
将以下内容放入其中:
start.sh
:
#!/bin/bash
touch ./console.txt
node ./MyScript.js |& tee console.txt &
wait
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);
});
start.sh
现在调用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
操作。为此,您要么
停止为该输出使用console.log,并切换到高质量的npm日志记录软件包,例如winston。
重新定义console.log(可能还有console.error),以将其输出保存在某种简单的express-app-scope数据结构中,也许是字符串数组。然后实施GET来读取该字符串数组,对其进行格式化,然后将其返回。
我的第一个建议是更具扩展性。
顺便说一句,请考虑使控制台日志可供恶意陌生人使用的安全隐患。