这应该是一个微不足道的问题,但我似乎并没有理解它。有没有简单的方法可以将我的所有console.log
输出重定向到文件? console.log
以一种很好的方式格式化提供的对象,并与不是简单的JSONable对象的对象正确交互。
例如,如果我这样做
var myerr = new Error('There has been an error');
console.log(myerr);
我得到了
[Error: There has been an error.]
如果我只是做
process.stdout.write(JSON.stringify(myerr));
我得到了
{}
如果我这样做
process.stdout.write(myerr.toString());
我得到了
Error: There has been an error
因此,如果我使用一个函数覆盖我的console.log
,该函数使用上面的任何技巧循环其参数并将输出重定向到文件,则日志将不完全相同。
所以我想知道:console.log
在将它们输出到控制台之前处理它所提供的对象有什么作用?它只是在每个对象上调用.toString()
,用[]
包装内容并将所有内容发送到process.stdout.write
?或者它是否进行其他类型的预处理?
答案 0 :(得分:5)
我认为使用linux I / O重定向的简单方法。 只需以这种方式运行您的应用程序:
node app.js > log.txt
来自您应用的所有输出消息都将重定向到log.txt
答案 1 :(得分:3)
Console的代码为:
Console.prototype.log = function() {
this._stdout.write(util.format.apply(null, arguments) + '\n');
};
你可以简单地做
const util = require('util');
process.stdout.write(util.format.apply(null, arguments) + '\n');
答案 2 :(得分:0)
通过对日志进行更精细控制来实现此目的的另一个好方法是使用winston。请在此处查看文件传输:https://github.com/winstonjs/winston/blob/master/docs/transports.md#file-transport
答案 3 :(得分:0)
这是使用 ES6 代理的另一种方法。大部分功劳归功于https://2ality.com/2015/10/intercepting-method-calls.html
function traceMethodCalls(obj)
{
return new Proxy(obj, {
get(target, methodName, receiver) {
// get origin method
const originMethod = target[methodName];
return function(...args) {
// write to file here
// call origin method
return originMethod.apply(this, args);
};
}
});
}
console = traceMethodCalls(console);
console.log("log");
console.warn("warn");
console.error("error");