'use strict'; const path = require('path'); const fs = require('mz/fs'); const moment = require('moment'); const utils = require('../../utils'); // clean all xxx.log.YYYY-MM-DD beofre expried date. module.exports = app => ({ schedule: { type: 'worker', // only one worker run this task cron: '0 0 * * *', // run every day at 00:00 }, async task() { const logger = app.coreLogger; const logDirs = new Set(); const loggerFiles = utils.walkLoggerFile(app.loggers); loggerFiles.forEach(file => { const logDir = path.dirname(file); logDirs.add(logDir); }); const maxDays = app.config.logrotator.maxDays; if (maxDays && maxDays > 0) { try { const tasks = Array.from(logDirs, logdir => removeExpiredLogFiles(logdir, maxDays, logger)); await Promise.all(tasks); } catch (err) { logger.error(err); } } logger.info('[egg-logrotator] clean all log before %s days', maxDays); }, }); // remove expired log files: xxx.log.YYYY-MM-DD async function removeExpiredLogFiles(logdir, maxDays, logger) { // ignore not exists dir const exists = await fs.exists(logdir); if (!exists) return; const files = await fs.readdir(logdir); const expriedDate = moment().subtract(maxDays, 'days').startOf('date'); const names = files.filter(file => { const name = path.extname(file).substring(1); if (!/^\d{4}\-\d{2}\-\d{2}/.test(name)) { return false; } const date = moment(name, 'YYYY-MM-DD').startOf('date'); if (!date.isValid()) { return false; } return date.isBefore(expriedDate); }); if (names.length === 0) { return; } logger.info(`[egg-logrotator] start remove ${logdir} files: ${names.join(', ')}`); await Promise.all(names.map(name => { const logfile = path.join(logdir, name); return fs.unlink(logfile) .catch(err => { err.message = `[egg-logrotator] remove logfile ${logfile} error, ${err.message}`; logger.error(err); }); })); }