UNPKG

@eggjs/logrotator

Version:
81 lines 6.76 kB
"use strict"; 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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