pm2-logrotate 在windows环境下无法删除过期日志的情况

205 阅读1分钟

众所周知,日志文件肯定需要按天或者按大小切割,超过需要保留的天数就应该删除。如果日志删除不了,占满空间则会影响很多服务。

背景:进程守护使用pm2,日志轮转使用pm2-logrotate,系统使用 Windows。

问题:在linux系统下,过期数据按照配置删除,但是windows系统下并没有删除,导致数据越来越多,需要人工删除或者自己再写一个删除脚本,很麻烦。

目标:找到为什么在windows下没有删除成功,以及如何修复。

先看pm2-logrotate 删除的代码。

function delete_old(file) {
  if (file === "/dev/null") return;
  var fileBaseName = file.substr(0, file.length - 4).split('/').pop() + "__";
  var dirName = path.dirname(file);

  fs.readdir(dirName, function(err, files) {
    var i, len;
    if (err) return pmx.notify(err);

    var rotated_files = [];
    for (i = 0, len = files.length; i < len; i++) {
      if (files[i].indexOf(fileBaseName) >= 0)
        rotated_files.push(files[i]);
    }
    rotated_files.sort().reverse();

    for (i = rotated_files.length - 1; i >= RETAIN; i--) {
      (function(i) {
        fs.unlink(path.resolve(dirName, rotated_files[i]), function (err) {
          if (err) return console.error(err);
          console.log('"' + rotated_files[i] + '" has been deleted');
        });
      })(i);
    }
  });
}

代码很好理解,偷懒的也可以直接丢给deepseek分析。 可以看到第三行有问题:文件路径切割的时候,这里已经写死了,但是Windows下路径分隔符为''。导致后面匹配不上。

修改的话,偷懒的话直接修改源代码,将分隔符改为''.

源代码位置在:

img_v3_02ja_b308e279-aed2-4fc2-bbf0-c3df47ada47g.jpg