@eggjs/logrotator
Version:
logrotator for egg
75 lines • 6.31 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const node_path_1 = __importDefault(require("node:path"));
const promises_1 = __importDefault(require("node:fs/promises"));
const utility_1 = require("utility");
const moment_1 = __importDefault(require("moment"));
const utils_js_1 = require("../../lib/utils.js");
// clean all xxx.log.YYYY-MM-DD before expired date.
exports.default = (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 = (0, utils_js_1.walkLoggerFile)(app.loggers);
for (const file of loggerFiles) {
const logDir = node_path_1.default.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('[@eggjs/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 stat = await (0, utility_1.exists)(logDir);
if (!stat) {
logger.warn(`[@eggjs/logrotator] logDir ${logDir} not exists`);
return;
}
const files = await promises_1.default.readdir(logDir);
const expiredDate = (0, moment_1.default)().subtract(maxDays, 'days').startOf('date');
const names = files.filter(file => {
const name = node_path_1.default.extname(file).slice(1);
if (!/^\d{4}-\d{2}-\d{2}/.test(name)) {
return false;
}
const date = (0, moment_1.default)(name, 'YYYY-MM-DD').startOf('date');
if (!date.isValid()) {
return false;
}
return date.isBefore(expiredDate);
});
if (names.length === 0) {
return;
}
logger.info(`[@eggjs/logrotator] start remove ${logDir} files: ${names.join(', ')}`);
await Promise.all(names.map(async (name) => {
const logFile = node_path_1.default.join(logDir, name);
try {
await promises_1.default.unlink(logFile);
}
catch (e) {
const err = e;
err.message = `[@eggjs/logrotator] remove logFile ${logFile} error, ${err.message}`;
logger.error(err);
}
}));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYW5fbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9zY2hlZHVsZS9jbGVhbl9sb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwwREFBNkI7QUFDN0IsZ0VBQWtDO0FBRWxDLHFDQUFpQztBQUNqQyxvREFBNEI7QUFHNUIsaURBQW9EO0FBRXBELG9EQUFvRDtBQUNwRCxrQkFBZSxDQUFDLEdBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNoQyxRQUFRLEVBQUU7UUFDUixJQUFJLEVBQUUsUUFBUSxFQUFFLGdDQUFnQztRQUNoRCxJQUFJLEVBQUUsV0FBVyxFQUFFLHlCQUF5QjtLQUM3QztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUM5QixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLElBQUEseUJBQWMsRUFBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEQsS0FBSyxNQUFNLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUMvQixNQUFNLE1BQU0sR0FBRyxtQkFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDOUMsSUFBSSxPQUFPLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQztnQkFDSCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRSxDQUN6QyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUMvQyxDQUFD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