pm2是一个很强大的运行管理工具,他可以将程序的标准输出打印到文件中,还可以监控程序运行状况,唯一的缺点是log不带滚动功能。
而官方推荐的pm2-logrotate本身也存在bug。好在pm2提供了reloadLog命令能让log文件更新,利用这里点。我写了一个syslog专门用于备份log,同时,及时调用pm2 reloadLog命令,由于是nodejs代码,所以同时支持windows与linux两套系统。
const { exec } = require('child_process')
const fs = require("fs");
const processlist = ["run"]
const logpath = 'logs/'
const logsize = 512*1024
const lognum = 30
const workinterval = 30
function getfilesize (filepath) {
return new Promise (function (resolve, reject) {
fs.stat(filepath, function(err, stats) {
if (err) {
resolve (0)
return
}
resolve (stats.size)
})
})
}
function unlink (filepath) {
return new Promise (function (resolve, reject) {
fs.unlink(filepath, function(err) {
resolve ()
})
})
}
function rename (oldpath, newpath) {
return new Promise (function (resolve, reject) {
fs.rename(oldpath, newpath, function(err) {
resolve ()
})
})
}
async function main () {
let needreload = false
for (let i = 0, len = processlist.length ; i < len ; i++) {
let proclog = logpath + processlist[i]
let size = await getfilesize (proclog + '-out.log')
if (size > logsize) {
needreload = true
await unlink (proclog + '-out' + lognum + '.log')
let j = lognum
while (j > 0) {
let k = j - 1
await rename (proclog + '-out' + k + '.log', proclog + '-out' + j + '.log')
j = k
}
await rename (proclog + '-out.log', proclog + '-out0.log')
}
size = await getfilesize (proclog + '-error.log')
if (size > logsize) {
needreload = true
let j = lognum
while (j > 0) {
let k = j - 1
await rename (proclog + '-error' + k + '.log', proclog + '-error' + j + '.log')
j = k
}
await rename (proclog + '-error.log', proclog + '-error0.log')
}
}
if (needreload) {
exec ('pm2 reloadLogs', function () {})
}
}
main ()
setInterval (function () {
main ()
}, workinterval*1000)文章作者:沃航科技