'use strict';
|
|
const path = require('path');
|
const moment = require('moment');
|
const fs = require('mz/fs');
|
const debug = require('debug')('egg-logrotator:day_rotator');
|
const Rotator = require('./rotator');
|
const utils = require('../../utils');
|
|
|
// rotate log by day
|
// rename from foo.log to foo.log.YYYY-MM-DD
|
class DayRotator extends Rotator {
|
|
constructor(options) {
|
super(options);
|
this.filesRotateBySize = this.app.config.logrotator.filesRotateBySize || [];
|
this.filesRotateByHour = this.app.config.logrotator.filesRotateByHour || [];
|
}
|
|
async getRotateFiles() {
|
const files = new Map();
|
const logDir = this.app.config.logger.dir;
|
const loggers = this.app.loggers;
|
const loggerFiles = utils.walkLoggerFile(loggers);
|
loggerFiles.forEach(file => {
|
// support relative path
|
if (!path.isAbsolute(file)) file = path.join(logDir, file);
|
this._setFile(file, files);
|
});
|
|
// Should rotate agent log, because schedule is running under app worker,
|
// agent log is the only differece between app worker and agent worker.
|
// - app worker -> egg-web.log
|
// - agent worker -> egg-agent.log
|
const agentLogName = this.app.config.logger.agentLogName;
|
this._setFile(path.join(logDir, agentLogName), files);
|
|
// rotateLogDirs is deprecated
|
const rotateLogDirs = this.app.config.logger.rotateLogDirs;
|
if (rotateLogDirs && rotateLogDirs.length > 0) {
|
this.app.deprecate('[egg-logrotator] Do not use app.config.logger.rotateLogDirs, only rotate core loggers and custom loggers');
|
|
for (const dir of rotateLogDirs) {
|
const exists = await fs.exists(dir);
|
if (!exists) continue;
|
|
try {
|
const names = await fs.readdir(dir);
|
for (const name of names) {
|
if (!name.endsWith('.log')) {
|
continue;
|
}
|
this._setFile(path.join(dir, name), files);
|
}
|
} catch (err) {
|
this.logger.error(err);
|
}
|
}
|
}
|
|
return files;
|
}
|
|
_setFile(srcPath, files) {
|
// don't rotate logPath in filesRotateBySize
|
if (this.filesRotateBySize.indexOf(srcPath) > -1) {
|
return;
|
}
|
|
// don't rotate logPath in filesRotateByHour
|
if (this.filesRotateByHour.indexOf(srcPath) > -1) {
|
return;
|
}
|
|
if (!files.has(srcPath)) {
|
// allow 2 minutes deviation
|
const targetPath = srcPath + moment()
|
.subtract(23, 'hours')
|
.subtract(58, 'minutes')
|
.format('.YYYY-MM-DD');
|
debug('set file %s => %s', srcPath, targetPath);
|
files.set(srcPath, { srcPath, targetPath });
|
}
|
}
|
}
|
|
module.exports = DayRotator;
|