【发布时间】:2017-10-15 19:07:47
【问题描述】:
我正在使用 Node.js,我想创建一个函数来获取所有 控制台日志(使用 console.log(message))。
如何获取所有控制台日志并将它们写入文件(不是覆盖)?
【问题讨论】:
标签: javascript node.js file logging
我正在使用 Node.js,我想创建一个函数来获取所有 控制台日志(使用 console.log(message))。
如何获取所有控制台日志并将它们写入文件(不是覆盖)?
【问题讨论】:
标签: javascript node.js file logging
对于 nodejs 库,npm repo 是您的朋友 - 您可以找到很多库并尝试最适合您需求的库。例如https://www.npmjs.com/package/log 搜索log 的第一个结果。
您当然也可以在控制台中实现自己的钩子来执行此操作,方法是用您自己的写入您选择的文件的函数覆盖控制台函数,例如:
var fs = require('fs');
function myLog(file) {
return function() {
fs.appendFileSync(file || 'log.txt', arguments.join('\n'));
}
}
console.log = myLog();
console.warn = myLog();
console.error = myLog('errorLog.txt');
【讨论】:
myLog() 而不是console.log()?另外,console.log 是日志,还是我只是覆盖了函数?
arguments.join函数的右括号
TypeError: arguments.join is not a function 编辑:是的,参数没有连接方法
return binding.writeBuffer(fd, buffer, offset, length, position); ^ Error: EBADF: bad file descriptor, write 编辑:这是一些代码:var fs = require('fs'); var args = Array.prototype.slice.call(arguments); function myLog(file) { return function() { fs.appendFileSync(file | 'log.txt', args.join('\n')); } } console.log = myLog('consoleLog.txt');
logger.js
var fs = require('fs');
var log = [];
//override default console.log behaviour
console.log = function(d) {
process.stdout.write(d + '\n');
log.push(d); //intercept every log and keep the value
};
//log to file
function log(filePath, clb){
clb = clb || function(){}; //optional callback
fs.truncate(filePath, 0, function() {
fs.writeFile(filePath, string, function (err) {
clb(err)
});
});
}
module.exports = log;
然后在您的代码中导入文件并在需要时调用该函数。
var logger = require('./logger');
logger.log('log.txt', function(err){
if(err)
console.log(err);
//else ok
});
【讨论】:
Error: Cannot find module './logger'
一种简单的方法是使用记录数据并写入文件系统的函数覆盖控制台上的 log 函数。
大致思路如下:
function attachFSLogger(filePath) {
// remember the old log method
const oldLog = console.log; // remove this line if you only want to log into the file
// override console.log
console.log = (...messages) => {
// log the console message immediately as usual
oldLog.apply(console, messages); // remove this line if you only want to log into the file
// asynchronously append to the file log
fs.appendFile(filePath, messages.join('\n'), (err) => {
if (err) throw err;
});
}
}
attachFSLogger('./logs.txt');
console.log('test'); // logs 'test' and also appends 'test' to logs.txt
如果您希望经常记录事情,使用流会更efficient:
function attachFSLogger(filePath) {
// remember the old log method
const oldLog = console.log; // remove this line if you only want to log into the file
// create a write stream for the given file path
const fsLog = fs.createWriteStream(filePath, {
flags: 'a' // 'a' means appending
})
// override console.log
console.log = (...messages) => {
// log the console message immediately as usual
oldLog.apply(console, messages); // remove this line if you only want to log into the file
// stream message to the file log
fsLog.write(messages.join('\n'));
}
}
attachFSLogger('./logs.txt');
console.log('test'); // logs 'test' and also appends 'test' to logs.txt
话虽如此,有很多图书馆可以为您做这样的事情,并且已经过彻底的测试。
这是一对:
【讨论】:
Error: EPERM: operation not permitted, open 'C:\Program Files\nodejs\logs.txt' at Error (native)这是我试的时候返回的
'\n'。如fsLog.write('\n' + messages.join('\n'))