日志备份&清理【建议用业务自带的备份,如果业务没有可开启此备份功能】

一: 日志备份是通过利用node子进程调用shell脚本来实现;child_process.exec方法可以直接调用系统命令,对于node来说只是注册一个异步任务,性能消耗可忽略不计。真正执行备份的是shell,理论上是比node性能更高一点

二: 因为数据组会实时监听qtracer.span.log文件拉取更新,所以业务可随时灵活删除或者备份,建议采用跟业务的access.log一样的清理方式就可以

三: qtrace-node日志备份分为按时间备份和按log文件大小备份

四: 多进程下日志备份 由于业务的复杂性,有的时候会多进程+多线程的使用方式,这种情况下备份多次会造成部分数据丢失,所以用node文件锁的方式来规避,如下

读取文件时设置隔离标志,隔离标志是指,当使用fs模块打开文件时,在打开模式中,添加一个x标记,例如下面的代码将以独占的方式去读写一个文件:

'w' - 以读取模式打开文件,如果文件不存在则创建
fs.open('qtrace.lock', 'wx', (err) => {
 if (err) return console.log('qtrace: locker正在发挥作用生');
  // about code
});

什么时候解锁?
在node应用退出的时候会发出一个名为SIGINT的消息,通过监听这个消息来平滑处理应用退出的收尾清理操作

process.on('SIGINT', () => {
  //在这里解锁
  fs.existsSync(__path) && fs.unlinkSync('qtrace.lock');
});