@eggjs/logrotator
Version:
logrotator for egg
81 lines • 6.76 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.LogRotator = void 0;
const node_assert_1 = __importDefault(require("node:assert"));
const node_fs_1 = require("node:fs");
const promises_1 = __importDefault(require("node:fs/promises"));
const promises_2 = require("node:stream/promises");
const node_zlib_1 = require("node:zlib");
const node_util_1 = require("node:util");
const utility_1 = require("utility");
const debug = (0, node_util_1.debuglog)('@eggjs/logrotator/lib/rotator');
class LogRotator {
options;
app;
logger;
constructor(options) {
this.options = options;
(0, node_assert_1.default)(this.options.app, 'options.app is required');
this.app = this.options.app;
this.logger = this.app.coreLogger;
}
async rotate() {
const files = await this.getRotateFiles();
(0, node_assert_1.default)(files instanceof Map, 'getRotateFiles should return a Map');
const rotatedFiles = [];
for (const file of files.values()) {
try {
debug('rename from %s to %s', file.srcPath, file.targetPath);
await renameOrDelete(file.srcPath, file.targetPath, this.app.config.logrotator.gzip);
rotatedFiles.push(`${file.srcPath} -> ${file.targetPath}`);
}
catch (e) {
const err = e;
err.message =
`[@eggjs/logrotator] rename ${file.srcPath}, found exception: ` +
err.message;
this.logger.error(err);
}
}
if (rotatedFiles.length > 0) {
// tell every one to reload logger
this.logger.info('[@eggjs/logrotator] broadcast log-reload');
this.app.messenger.sendToApp('log-reload');
this.app.messenger.sendToAgent('log-reload');
}
this.logger.info('[@eggjs/logrotator] rotate files success by %s, files %j', this.constructor.name, rotatedFiles);
}
}
exports.LogRotator = LogRotator;
// rename from srcPath to targetPath, for example foo.log.1 > foo.log.2
// if gzip is true, then use gzip to compress the file, and delete the src file, for example foo.log.1 -> foo.log.2.gz
async function renameOrDelete(srcPath, targetPath, gzip) {
if (srcPath === targetPath) {
return;
}
const srcExists = await (0, utility_1.exists)(srcPath);
if (!srcExists) {
return;
}
const targetExists = await (0, utility_1.exists)(targetPath);
// if target file exists, then throw
// because the target file always be renamed first.
if (targetExists) {
const err = new Error(`targetFile ${targetPath} exists!!!`);
throw err;
}
// if gzip is true, then use gzip
if (gzip === true) {
const tmpPath = `${targetPath}.tmp`;
await promises_1.default.rename(srcPath, tmpPath);
await (0, promises_2.pipeline)((0, node_fs_1.createReadStream)(tmpPath), (0, node_zlib_1.createGzip)(), (0, node_fs_1.createWriteStream)(targetPath));
await promises_1.default.unlink(tmpPath);
}
else {
await promises_1.default.rename(srcPath, targetPath);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcm90YXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4REFBaUM7QUFDakMscUNBQThEO0FBQzlELGdFQUFrQztBQUNsQyxtREFBZ0Q7QUFDaEQseUNBQXVDO0FBQ3ZDLHlDQUFxQztBQUVyQyxxQ0FBaUM7QUFHakMsTUFBTSxLQUFLLEdBQUcsSUFBQSxvQkFBUSxFQUFDLCtCQUErQixDQUFDLENBQUM7QUFXeEQsTUFBc0IsVUFBVTtJQUNYLE9BQU8sQ0FBaUI7SUFDeEIsR0FBRyxDQUFVO0lBQ2IsTUFBTSxDQUF3QjtJQUVqRCxZQUFZLE9BQXVCO1FBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUEscUJBQU0sRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBSUQsS0FBSyxDQUFDLE1BQU07UUFDVixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMxQyxJQUFBLHFCQUFNLEVBQUMsS0FBSyxZQUFZLEdBQUcsRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sWUFBWSxHQUFhLEVBQUUsQ0FBQztRQUNsQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQztnQkFDSCxLQUFLLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzdELE1BQU0sY0FBYyxDQUNs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