将console.log输出重定向到文件

时间:2016-04-17 15:59:33

标签: node.js file console.log

这应该是一个微不足道的问题,但我似乎并没有理解它。有没有简单的方法可以将我的所有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?或者它是否进行其他类型的预处理?

4 个答案:

答案 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");