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)
文章作者:沃航科技