我有另一个问题(last question)。目前我正在开发一个Node.js项目,在这个项目中我有很多 console.log()函数。到目前为止,这一切都运行正常,但我也希望写入控制台的所有内容也都写在日志文件中。有人可以帮帮我吗?
例如:
Console.log('The value of array position [5] is '+ array[5]);
在我的真实代码中,它会更多,但这应该会给你一个想法。
希望你好。
答案 0 :(得分:33)
只需在终端中运行脚本......
node script-file.js > log-file.txt
这告诉shell将命令node script-file.js
的标准输出写入日志文件而不是默认值,将其打印到控制台。
这称为redirection,它非常强大。假设您想将所有错误写入单独的文件......
node script-file.js >log-file.txt 2>error-file.txt
现在所有console.log
都写入log-file.txt
,所有console.error
都写入error-file.txt
答案 1 :(得分:13)
我会使用库而不是重新发明轮子。我在npm上找了一个log4j
类型的库,它提出了https://github.com/nomiddlename/log4js-node
如果要登录控制台和文件:
var log4js = require('log4js');
log4js.configure({
appenders: [
{ type: 'console' },
{ type: 'file', filename: 'logs/cheese.log', category: 'cheese' }
]
});
现在您的代码可以使用
创建一个新的记录器var logger = log4js.getLogger('cheese');
并在代码中使用记录器
logger.warn('Cheese is quite smelly.');
logger.info('Cheese is Gouda.');
logger.debug('Cheese is not a food.');
答案 2 :(得分:4)
您可以尝试覆盖内置的console.log
以执行不同的操作。
var originalLog = console.log;
console.log = function(str){
originalLog(str);
// Your extra code
}
但是,这会将originalLog
放入主范围,因此您应该尝试将其包装在函数中。这称为闭包,您可以阅读更多关于它们here。
(function(){
var originalLog = console.log;
console.log = function(str){
originalLog(str);
// Your extra code
})();
要编写文件,请参阅this stackoverflow问题,并覆盖console.log
甚至比我展示的方式更好,请参阅this。结合这两个答案将为您提供最佳解决方案。
答案 3 :(得分:2)
@ activedecay的答案似乎要走了。但是,从april 30th 2018
开始,我遇到了这个特定模型的问题(由于传递给.configure
的对象的结构导致节点崩溃,这似乎在最新版本中不起作用)。尽管如此,由于nodejs
调试消息,我设法解决了更新的解决方案...
const myLoggers = require('log4js');
myLoggers.configure({
appenders: { mylogger: { type:"file", filename: "path_to_file/filename" } },
categories: { default: { appenders:["mylogger"], level:"ALL" } }
});
const logger = myLoggers.getLogger("default");
现在,如果您想要登录到所述文件,您可以像 activedecay 一样向您展示:
logger.warn('Cheese is quite smelly.');
logger.info('Cheese is Gouda.');
logger.debug('Cheese is not a food.');
然而,这不会将任何内容记录到控制台,因为我还没有弄清楚如何在一个记录器中实现多个appender,你仍然可以实现好的console.log();
答案 4 :(得分:2)
const fs = require('fs');
const myConsole = new console.Console(fs.createWriteStream('./output.txt'));
myConsole.log('hello world');
这将创建一个输出文件,其中包含所有可以通过控制台内的console.log('hello world')
触发的输出。
这是将console.log()
输出转换为文本文件的最简单方法。
答案 5 :(得分:0)
只需编写自己的日志功能:
function log(message) {
console.log(message);
fs.writeFileSync(...);
}
然后将console.log()
的所有现有来电替换为log()
。