
所以我们每次可以在读取完之后记录一下当前文件字节大小下一次读取文件就是可以用该文件上次的大小开始读取
let size = fs.statSync(path.join(__dirname, '../public/api.err.log')).size;我们可以对比一下每次从0字节开始读取和从指定字节读取

保存数据进行分析
这里我是用
node-schedule这个库进行定时保存错误日志和linux的cron差不多,用的mongodb保存数据,这里更推荐大家用elasticsearch来做日志分析
rl.on('close', async () => {
let count = 0;
for (let i of rlist) {
count++;
if (count % 500 === 0) {
const res = await global.db.collection('logs').bulkWrite(rlist.slice(count, count + 500), { ordered: false, w: 1 }).catch(err => { console.error(`批量插入出错${err}`) });
} else if (count === rlist.length - 1) {
//批量插入 数据
const res = await global.db.collection('logs').bulkWrite(rlist.slice(rlist - (rlist % 500), rlist.length), { ordered: false, w: 1 });
let size = fs.statSync(addres).size;
size = size % 2 === 0 ? size : size + 1;//保证字节大小是偶数 不然会出现读取上行内容不完整的情况
count = 0;
rlist.length = [];
//更新数据库里面文件的size
global.db.collection('tasks').updateOne({ _id: addre }, { $set: { _id: addre, size, date: +new Date() } }, { upsert: true });
}
}
resolve(true);
})上面主要是500条保存一次,因为我用的是批量插入然后mongodb有限制一次性最多插入16M数据的限制,所以大家看自己清空决定一次性插入多少条 犹豫对readline的实现比较感兴趣,就去翻阅了一下源码发现并不是我们想的那么复杂, readline源码 ,下面贴一下line事件的源码,想继续深入的同学可以看看全部的源码
if (typeof s === 'string' && s) {
var lines = s.split(/rn|n|r/);
for (var i = 0, len = lines.length; i < len; i++) {
if (i > 0) {
this._line();
}
this._insertString(lines[i]);
}
}
...
Interface.prototype._line = function() {
const line = this._addHistory();
this.clearLine();
this._onLine(line);
};
...
Interface.prototype._onLine = function(line) {
if (this._questionCallback) {
var cb = this._questionCallback;









