12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- '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);
- });
- }));
- }
|