@eggjs/logrotator 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +123 -0
  3. package/README.zh-CN.md +115 -0
  4. package/dist/commonjs/agent.d.ts +2 -0
  5. package/dist/commonjs/agent.js +5 -0
  6. package/dist/commonjs/app/extend/agent.d.ts +5 -0
  7. package/dist/commonjs/app/extend/agent.js +8 -0
  8. package/dist/commonjs/app/extend/application.d.ts +5 -0
  9. package/dist/commonjs/app/extend/application.js +7 -0
  10. package/dist/commonjs/app/schedule/clean_log.d.ts +9 -0
  11. package/dist/commonjs/app/schedule/clean_log.js +74 -0
  12. package/dist/commonjs/app/schedule/rotate_by_file.d.ts +10 -0
  13. package/dist/commonjs/app/schedule/rotate_by_file.js +17 -0
  14. package/dist/commonjs/app/schedule/rotate_by_hour.d.ts +10 -0
  15. package/dist/commonjs/app/schedule/rotate_by_hour.js +17 -0
  16. package/dist/commonjs/app/schedule/rotate_by_size.d.ts +10 -0
  17. package/dist/commonjs/app/schedule/rotate_by_size.js +17 -0
  18. package/dist/commonjs/app.d.ts +2 -0
  19. package/dist/commonjs/app.js +5 -0
  20. package/dist/commonjs/boot.d.ts +6 -0
  21. package/dist/commonjs/boot.js +18 -0
  22. package/dist/commonjs/config/config.default.d.ts +64 -0
  23. package/dist/commonjs/config/config.default.js +16 -0
  24. package/dist/commonjs/index.d.ts +2 -0
  25. package/dist/commonjs/index.js +19 -0
  26. package/dist/commonjs/lib/day_rotator.d.ts +8 -0
  27. package/dist/commonjs/lib/day_rotator.js +89 -0
  28. package/dist/commonjs/lib/hour_rotator.d.ts +6 -0
  29. package/dist/commonjs/lib/hour_rotator.js +46 -0
  30. package/dist/commonjs/lib/rotator.d.ts +16 -0
  31. package/dist/commonjs/lib/rotator.js +78 -0
  32. package/dist/commonjs/lib/size_rotator.d.ts +5 -0
  33. package/dist/commonjs/lib/size_rotator.js +73 -0
  34. package/dist/commonjs/lib/utils.d.ts +11 -0
  35. package/dist/commonjs/lib/utils.js +24 -0
  36. package/dist/commonjs/package.json +3 -0
  37. package/dist/commonjs/types.d.ts +11 -0
  38. package/dist/commonjs/types.js +3 -0
  39. package/dist/esm/agent.d.ts +2 -0
  40. package/dist/esm/agent.js +3 -0
  41. package/dist/esm/app/extend/agent.d.ts +5 -0
  42. package/dist/esm/app/extend/agent.js +6 -0
  43. package/dist/esm/app/extend/application.d.ts +5 -0
  44. package/dist/esm/app/extend/application.js +5 -0
  45. package/dist/esm/app/schedule/clean_log.d.ts +9 -0
  46. package/dist/esm/app/schedule/clean_log.js +69 -0
  47. package/dist/esm/app/schedule/rotate_by_file.d.ts +10 -0
  48. package/dist/esm/app/schedule/rotate_by_file.js +15 -0
  49. package/dist/esm/app/schedule/rotate_by_hour.d.ts +10 -0
  50. package/dist/esm/app/schedule/rotate_by_hour.js +15 -0
  51. package/dist/esm/app/schedule/rotate_by_size.d.ts +10 -0
  52. package/dist/esm/app/schedule/rotate_by_size.js +15 -0
  53. package/dist/esm/app.d.ts +2 -0
  54. package/dist/esm/app.js +3 -0
  55. package/dist/esm/boot.d.ts +6 -0
  56. package/dist/esm/boot.js +14 -0
  57. package/dist/esm/config/config.default.d.ts +64 -0
  58. package/dist/esm/config/config.default.js +14 -0
  59. package/dist/esm/index.d.ts +2 -0
  60. package/dist/esm/index.js +3 -0
  61. package/dist/esm/lib/day_rotator.d.ts +8 -0
  62. package/dist/esm/lib/day_rotator.js +82 -0
  63. package/dist/esm/lib/hour_rotator.d.ts +6 -0
  64. package/dist/esm/lib/hour_rotator.js +39 -0
  65. package/dist/esm/lib/rotator.d.ts +16 -0
  66. package/dist/esm/lib/rotator.js +71 -0
  67. package/dist/esm/lib/size_rotator.d.ts +5 -0
  68. package/dist/esm/lib/size_rotator.js +66 -0
  69. package/dist/esm/lib/utils.d.ts +11 -0
  70. package/dist/esm/lib/utils.js +21 -0
  71. package/dist/esm/package.json +3 -0
  72. package/dist/esm/types.d.ts +11 -0
  73. package/dist/esm/types.js +2 -0
  74. package/dist/package.json +4 -0
  75. package/package.json +101 -0
  76. package/src/agent.ts +3 -0
  77. package/src/app/extend/agent.ts +6 -0
  78. package/src/app/extend/application.ts +5 -0
  79. package/src/app/schedule/clean_log.ts +74 -0
  80. package/src/app/schedule/rotate_by_file.ts +18 -0
  81. package/src/app/schedule/rotate_by_hour.ts +19 -0
  82. package/src/app/schedule/rotate_by_size.ts +18 -0
  83. package/src/app.ts +3 -0
  84. package/src/boot.ts +13 -0
  85. package/src/config/config.default.ts +74 -0
  86. package/src/index.ts +3 -0
  87. package/src/lib/day_rotator.ts +91 -0
  88. package/src/lib/hour_rotator.ts +44 -0
  89. package/src/lib/rotator.ts +88 -0
  90. package/src/lib/size_rotator.ts +67 -0
  91. package/src/lib/utils.ts +26 -0
  92. package/src/types.ts +15 -0
  93. package/src/typings/index.d.ts +4 -0
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DayRotator = void 0;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const moment_1 = __importDefault(require("moment"));
9
+ const promises_1 = __importDefault(require("node:fs/promises"));
10
+ const node_util_1 = require("node:util");
11
+ const utility_1 = require("utility");
12
+ const rotator_js_1 = require("./rotator.js");
13
+ const utils_js_1 = require("./utils.js");
14
+ const debug = (0, node_util_1.debuglog)('@eggjs/logrotator/lib/day_rotator');
15
+ // rotate log by day
16
+ // rename from foo.log to foo.log.YYYY-MM-DD
17
+ class DayRotator extends rotator_js_1.LogRotator {
18
+ filesRotateBySize;
19
+ filesRotateByHour;
20
+ constructor(options) {
21
+ super(options);
22
+ this.filesRotateBySize = this.app.config.logrotator.filesRotateBySize || [];
23
+ this.filesRotateByHour = this.app.config.logrotator.filesRotateByHour || [];
24
+ }
25
+ async getRotateFiles() {
26
+ const files = new Map();
27
+ const logDir = this.app.config.logger.dir;
28
+ const loggers = this.app.loggers;
29
+ const loggerFiles = (0, utils_js_1.walkLoggerFile)(loggers);
30
+ loggerFiles.forEach(file => {
31
+ // support relative path
32
+ if (!node_path_1.default.isAbsolute(file)) {
33
+ file = node_path_1.default.join(logDir, file);
34
+ }
35
+ this._setFile(file, files);
36
+ });
37
+ // Should rotate agent log, because schedule is running under app worker,
38
+ // agent log is the only difference between app worker and agent worker.
39
+ // - app worker -> egg-web.log
40
+ // - agent worker -> egg-agent.log
41
+ const agentLogName = this.app.config.logger.agentLogName;
42
+ this._setFile(node_path_1.default.join(logDir, agentLogName), files);
43
+ // rotateLogDirs is deprecated
44
+ const rotateLogDirs = this.app.config.logger.rotateLogDirs;
45
+ if (rotateLogDirs && rotateLogDirs.length > 0) {
46
+ this.app.deprecate('[egg-logrotator] Do not use app.config.logger.rotateLogDirs, only rotate core loggers and custom loggers');
47
+ for (const dir of rotateLogDirs) {
48
+ const stat = await (0, utility_1.exists)(dir);
49
+ if (!stat)
50
+ continue;
51
+ try {
52
+ const names = await promises_1.default.readdir(dir);
53
+ for (const name of names) {
54
+ if (!name.endsWith('.log')) {
55
+ continue;
56
+ }
57
+ this._setFile(node_path_1.default.join(dir, name), files);
58
+ }
59
+ }
60
+ catch (err) {
61
+ this.logger.error(err);
62
+ }
63
+ }
64
+ }
65
+ return files;
66
+ }
67
+ _setFile(srcPath, files) {
68
+ // don't rotate logPath in filesRotateBySize
69
+ if (this.filesRotateBySize.indexOf(srcPath) > -1) {
70
+ return;
71
+ }
72
+ // don't rotate logPath in filesRotateByHour
73
+ if (this.filesRotateByHour.indexOf(srcPath) > -1) {
74
+ return;
75
+ }
76
+ if (!files.has(srcPath)) {
77
+ const ext = this.app.config.logrotator.gzip === true ? '.gz' : '';
78
+ // allow 2 minutes deviation
79
+ const targetPath = srcPath + (0, moment_1.default)()
80
+ .subtract(23, 'hours')
81
+ .subtract(58, 'minutes')
82
+ .format('.YYYY-MM-DD') + ext;
83
+ debug('set file %s => %s', srcPath, targetPath);
84
+ files.set(srcPath, { srcPath, targetPath });
85
+ }
86
+ }
87
+ }
88
+ exports.DayRotator = DayRotator;
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF5X3JvdGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2RheV9yb3RhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBEQUE2QjtBQUM3QixvREFBNEI7QUFDNUIsZ0VBQWtDO0FBQ2xDLHlDQUFxQztBQUNyQyxxQ0FBaUM7QUFDakMsNkNBQXNFO0FBQ3RFLHlDQUE0QztBQUU1QyxNQUFNLEtBQUssR0FBRyxJQUFBLG9CQUFRLEVBQUMsbUNBQW1DLENBQUMsQ0FBQztBQUU1RCxvQkFBb0I7QUFDcEIsNENBQTRDO0FBQzVDLE1BQWEsVUFBVyxTQUFRLHVCQUFVO0lBQ2hDLGlCQUFpQixDQUFXO0lBQzVCLGlCQUFpQixDQUFXO0lBRXBDLFlBQVksT0FBdUI7UUFDakMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUM7UUFDNUUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUM7SUFDOUUsQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjO1FBQ2xCLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFzQixDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDMUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDakMsTUFBTSxXQUFXLEdBQUcsSUFBQSx5QkFBYyxFQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDekIsd0JBQXdCO1lBQ3hCLElBQUks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
@@ -0,0 +1,6 @@
1
+ import { LogRotator, RotateFile } from './rotator.js';
2
+ export declare class HourRotator extends LogRotator {
3
+ getRotateFiles(): Promise<Map<string, RotateFile>>;
4
+ get hourDelimiter(): string;
5
+ _setFile(srcPath: string, files: Map<string, RotateFile>): void;
6
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HourRotator = void 0;
7
+ const moment_1 = __importDefault(require("moment"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const node_util_1 = require("node:util");
10
+ const utility_1 = require("utility");
11
+ const rotator_js_1 = require("./rotator.js");
12
+ const debug = (0, node_util_1.debuglog)('@eggjs/logrotator/lib/hour_rotator');
13
+ // rotate log by hour
14
+ // rename from foo.log to foo.log.YYYY-MM-DD-HH
15
+ class HourRotator extends rotator_js_1.LogRotator {
16
+ async getRotateFiles() {
17
+ const files = new Map();
18
+ const logDir = this.app.config.logger.dir;
19
+ const filesRotateByHour = this.app.config.logrotator.filesRotateByHour || [];
20
+ for (let logPath of filesRotateByHour) {
21
+ // support relative path
22
+ if (!node_path_1.default.isAbsolute(logPath)) {
23
+ logPath = node_path_1.default.join(logDir, logPath);
24
+ }
25
+ const stat = await (0, utility_1.exists)(logPath);
26
+ if (!stat) {
27
+ continue;
28
+ }
29
+ this._setFile(logPath, files);
30
+ }
31
+ return files;
32
+ }
33
+ get hourDelimiter() {
34
+ return this.app.config.logrotator.hourDelimiter;
35
+ }
36
+ _setFile(srcPath, files) {
37
+ if (!files.has(srcPath)) {
38
+ const ext = this.app.config.logrotator.gzip === true ? '.gz' : '';
39
+ const targetPath = srcPath + (0, moment_1.default)().subtract(1, 'hours').format(`.YYYY-MM-DD${this.hourDelimiter}HH`) + ext;
40
+ debug('set file %s => %s', srcPath, targetPath);
41
+ files.set(srcPath, { srcPath, targetPath });
42
+ }
43
+ }
44
+ }
45
+ exports.HourRotator = HourRotator;
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG91cl9yb3RhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ob3VyX3JvdGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDBEQUE2QjtBQUM3Qix5Q0FBcUM7QUFDckMscUNBQWlDO0FBQ2pDLDZDQUFzRDtBQUV0RCxNQUFNLEtBQUssR0FBRyxJQUFBLG9CQUFRLEVBQUMsb0NBQW9DLENBQUMsQ0FBQztBQUU3RCxxQkFBcUI7QUFDckIsK0NBQStDO0FBQy9DLE1BQWEsV0FBWSxTQUFRLHVCQUFVO0lBQ3pDLEtBQUssQ0FBQyxjQUFjO1FBQ2xCLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFzQixDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDMUMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDO1FBRTdFLEtBQUssSUFBSSxPQUFPLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0Qyx3QkFBd0I7WUFDeEIsSUFBSSxDQUFDLG1CQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sR0FBRyxtQkFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdkMsQ0FBQztZQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBQSxnQkFBTSxFQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDVixTQUFTO1lBQ1gsQ0FBQztZQUNELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7SUFDbEQsQ0FBQztJQUVELFFBQVEsQ0FBQyxPQUFlLEVBQUUsS0FBOEI7UUFDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN4QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbEUsTUFBTSxVQUFVLEdBQUcsT0FBTyxHQUFHLElBQUEsZ0JBQU0sR0FBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQzlHLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDaEQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBakNELGtDQWlDQyJ9
@@ -0,0 +1,16 @@
1
+ import { EggCore } from '@eggjs/core';
2
+ export interface RotatorOptions {
3
+ app: EggCore;
4
+ }
5
+ export interface RotateFile {
6
+ srcPath: string;
7
+ targetPath: string;
8
+ }
9
+ export declare abstract class LogRotator {
10
+ protected readonly options: RotatorOptions;
11
+ protected readonly app: EggCore;
12
+ protected readonly logger: EggCore['coreLogger'];
13
+ constructor(options: RotatorOptions);
14
+ abstract getRotateFiles(): Promise<Map<string, RotateFile>>;
15
+ rotate(): Promise<void>;
16
+ }
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LogRotator = void 0;
7
+ const node_assert_1 = __importDefault(require("node:assert"));
8
+ const node_fs_1 = require("node:fs");
9
+ const promises_1 = __importDefault(require("node:fs/promises"));
10
+ const promises_2 = require("node:stream/promises");
11
+ const node_zlib_1 = require("node:zlib");
12
+ const node_util_1 = require("node:util");
13
+ const utility_1 = require("utility");
14
+ const debug = (0, node_util_1.debuglog)('@eggjs/logrotator/lib/rotator');
15
+ class LogRotator {
16
+ options;
17
+ app;
18
+ logger;
19
+ constructor(options) {
20
+ this.options = options;
21
+ (0, node_assert_1.default)(this.options.app, 'options.app is required');
22
+ this.app = this.options.app;
23
+ this.logger = this.app.coreLogger;
24
+ }
25
+ async rotate() {
26
+ const files = await this.getRotateFiles();
27
+ (0, node_assert_1.default)(files instanceof Map, 'getRotateFiles should return a Map');
28
+ const rotatedFiles = [];
29
+ for (const file of files.values()) {
30
+ try {
31
+ debug('rename from %s to %s', file.srcPath, file.targetPath);
32
+ await renameOrDelete(file.srcPath, file.targetPath, this.app.config.logrotator.gzip);
33
+ rotatedFiles.push(`${file.srcPath} -> ${file.targetPath}`);
34
+ }
35
+ catch (err) {
36
+ err.message = `[@eggjs/logrotator] rename ${file.srcPath}, found exception: ` + err.message;
37
+ this.logger.error(err);
38
+ }
39
+ }
40
+ if (rotatedFiles.length) {
41
+ // tell every one to reload logger
42
+ this.logger.info('[@eggjs/logrotator] broadcast log-reload');
43
+ this.app.messenger.sendToApp('log-reload');
44
+ this.app.messenger.sendToAgent('log-reload');
45
+ }
46
+ this.logger.info('[@eggjs/logrotator] rotate files success by %s, files %j', this.constructor.name, rotatedFiles);
47
+ }
48
+ }
49
+ exports.LogRotator = LogRotator;
50
+ // rename from srcPath to targetPath, for example foo.log.1 > foo.log.2
51
+ // 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
52
+ async function renameOrDelete(srcPath, targetPath, gzip) {
53
+ if (srcPath === targetPath) {
54
+ return;
55
+ }
56
+ const srcExists = await (0, utility_1.exists)(srcPath);
57
+ if (!srcExists) {
58
+ return;
59
+ }
60
+ const targetExists = await (0, utility_1.exists)(targetPath);
61
+ // if target file exists, then throw
62
+ // because the target file always be renamed first.
63
+ if (targetExists) {
64
+ const err = new Error(`targetFile ${targetPath} exists!!!`);
65
+ throw err;
66
+ }
67
+ // if gzip is true, then use gzip
68
+ if (gzip === true) {
69
+ const tmpPath = `${targetPath}.tmp`;
70
+ await promises_1.default.rename(srcPath, tmpPath);
71
+ await (0, promises_2.pipeline)((0, node_fs_1.createReadStream)(tmpPath), (0, node_zlib_1.createGzip)(), (0, node_fs_1.createWriteStream)(targetPath));
72
+ await promises_1.default.unlink(tmpPath);
73
+ }
74
+ else {
75
+ await promises_1.default.rename(srcPath, targetPath);
76
+ }
77
+ }
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcm90YXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4REFBaUM7QUFDakMscUNBQThEO0FBQzlELGdFQUFrQztBQUNsQyxtREFBZ0Q7QUFDaEQseUNBQXVDO0FBQ3ZDLHlDQUFxQztBQUNyQyxxQ0FBaUM7QUFHakMsTUFBTSxLQUFLLEdBQUcsSUFBQSxvQkFBUSxFQUFDLCtCQUErQixDQUFDLENBQUM7QUFXeEQsTUFBc0IsVUFBVTtJQUNYLE9BQU8sQ0FBaUI7SUFDeEIsR0FBRyxDQUFVO0lBQ2IsTUFBTSxDQUF3QjtJQUVqRCxZQUFZLE9BQXVCO1FBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUEscUJBQU0sRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBSUQsS0FBSyxDQUFDLE1BQU07UUFDVixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMxQyxJQUFBLHFCQUFNLEVBQUMsS0FBSyxZQUFZLEdBQUcsRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sWUFBWSxHQUFhLEVBQUUsQ0FBQztRQUNsQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQztnQkFDSCxLQUFLLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzdELE1BQU0sY0FBYyxDQUFD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
@@ -0,0 +1,5 @@
1
+ import { LogRotator, RotateFile } from './rotator.js';
2
+ export declare class SizeRotator extends LogRotator {
3
+ getRotateFiles(): Promise<Map<string, RotateFile>>;
4
+ _setFile(logPath: string, files: Map<string, RotateFile>): void;
5
+ }
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SizeRotator = void 0;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const node_util_1 = require("node:util");
10
+ const utility_1 = require("utility");
11
+ const rotator_js_1 = require("./rotator.js");
12
+ const debug = (0, node_util_1.debuglog)('@eggjs/logrotator/lib/size_rotator');
13
+ // rotate log by size, if the size of file over maxFileSize,
14
+ // it will rename from foo.log to foo.log.1
15
+ // if foo.log.1 exists, foo.log.1 will rename to foo.log.2
16
+ class SizeRotator extends rotator_js_1.LogRotator {
17
+ async getRotateFiles() {
18
+ const files = new Map();
19
+ const logDir = this.app.config.logger.dir;
20
+ const filesRotateBySize = this.app.config.logrotator.filesRotateBySize || [];
21
+ const maxFileSize = this.app.config.logrotator.maxFileSize;
22
+ const maxFiles = this.app.config.logrotator.maxFiles;
23
+ for (let logPath of filesRotateBySize) {
24
+ // support relative path
25
+ if (!node_path_1.default.isAbsolute(logPath)) {
26
+ logPath = node_path_1.default.join(logDir, logPath);
27
+ }
28
+ const stat = await (0, utility_1.exists)(logPath);
29
+ if (!stat) {
30
+ continue;
31
+ }
32
+ const size = stat.size;
33
+ try {
34
+ if (size >= maxFileSize) {
35
+ this.logger.info(`[@eggjs/logrotator] file ${logPath} reach the maximum file size, current size: ${size}, max size: ${maxFileSize}`);
36
+ // delete max log file if exists, otherwise will throw when rename
37
+ const maxFileName = `${logPath}.${maxFiles}`;
38
+ const stat = await (0, utility_1.exists)(maxFileName);
39
+ if (stat) {
40
+ await promises_1.default.unlink(maxFileName);
41
+ this.logger.info(`[@eggjs/logrotator] delete max log file ${maxFileName}`);
42
+ }
43
+ this._setFile(logPath, files);
44
+ }
45
+ }
46
+ catch (err) {
47
+ err.message = '[@eggjs/logrotator] ' + err.message;
48
+ this.logger.error(err);
49
+ }
50
+ }
51
+ return files;
52
+ }
53
+ _setFile(logPath, files) {
54
+ const maxFiles = this.app.config.logrotator.maxFiles;
55
+ if (files.has(logPath)) {
56
+ return;
57
+ }
58
+ const ext = this.app.config.logrotator.gzip === true ? '.gz' : '';
59
+ // foo.log.2 -> foo.log.3
60
+ // foo.log.1 -> foo.log.2
61
+ for (let i = maxFiles - 1; i >= 1; i--) {
62
+ const srcPath = `${logPath}.${i}`;
63
+ const targetPath = `${logPath}.${i + 1}${ext}`;
64
+ debug('set file %s => %s', srcPath, targetPath);
65
+ files.set(srcPath, { srcPath, targetPath });
66
+ }
67
+ // foo.log -> foo.log.1
68
+ debug('set file %s => %s', logPath, `${logPath}.1`);
69
+ files.set(logPath, { srcPath: logPath, targetPath: `${logPath}.1${ext}` });
70
+ }
71
+ }
72
+ exports.SizeRotator = SizeRotator;
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2l6ZV9yb3RhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zaXplX3JvdGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0VBQWtDO0FBQ2xDLDBEQUE2QjtBQUM3Qix5Q0FBcUM7QUFDckMscUNBQWlDO0FBQ2pDLDZDQUFzRDtBQUV0RCxNQUFNLEtBQUssR0FBRyxJQUFBLG9CQUFRLEVBQUMsb0NBQW9DLENBQUMsQ0FBQztBQUU3RCw0REFBNEQ7QUFDNUQsMkNBQTJDO0FBQzNDLDBEQUEwRDtBQUMxRCxNQUFhLFdBQVksU0FBUSx1QkFBVTtJQUN6QyxLQUFLLENBQUMsY0FBYztRQUNsQixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztRQUM1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQzFDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztRQUM3RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO1FBQzNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFDckQsS0FBSyxJQUFJLE9BQU8sSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RDLHdCQUF3QjtZQUN4QixJQUFJLENBQUMsbUJBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxHQUFHLG1CQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFBLGdCQUFNLEVB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
@@ -0,0 +1,11 @@
1
+ interface LoggerTransport {
2
+ options: {
3
+ file: string;
4
+ };
5
+ }
6
+ /**
7
+ * Walk all logger files from loggers
8
+ * @param loggers - The loggers to walk
9
+ */
10
+ export declare function walkLoggerFile(loggers: Record<string, Map<string, LoggerTransport>>): string[];
11
+ export {};
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.walkLoggerFile = walkLoggerFile;
4
+ /**
5
+ * Walk all logger files from loggers
6
+ * @param loggers - The loggers to walk
7
+ */
8
+ function walkLoggerFile(loggers) {
9
+ const files = [];
10
+ for (const key in loggers) {
11
+ if (!loggers.hasOwnProperty(key)) {
12
+ continue;
13
+ }
14
+ const registeredLogger = loggers[key];
15
+ for (const transport of registeredLogger.values()) {
16
+ const file = transport.options.file;
17
+ if (file) {
18
+ files.push(file);
19
+ }
20
+ }
21
+ }
22
+ return files;
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBVUEsd0NBZUM7QUFuQkQ7OztHQUdHO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLE9BQXFEO0lBQ2xGLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakMsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxLQUFLLE1BQU0sU0FBUyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDcEMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDVCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyJ9
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,11 @@
1
+ import type { LogrotatorConfig } from './config/config.default.js';
2
+ import type { LogRotator } from './lib/rotator.js';
3
+ export type { LogrotatorConfig };
4
+ declare module '@eggjs/core' {
5
+ interface EggAppConfig {
6
+ logrotator: LogrotatorConfig;
7
+ }
8
+ interface EggCore {
9
+ LogRotator: typeof LogRotator;
10
+ }
11
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,2 @@
1
+ import { Boot } from './boot.js';
2
+ export default Boot;
@@ -0,0 +1,3 @@
1
+ import { Boot } from './boot.js';
2
+ export default Boot;
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVqQyxlQUFlLElBQUksQ0FBQyJ9
@@ -0,0 +1,5 @@
1
+ import { LogRotator } from '../../lib/rotator.js';
2
+ declare const _default: {
3
+ LogRotator: typeof LogRotator;
4
+ };
5
+ export default _default;
@@ -0,0 +1,6 @@
1
+ import { LogRotator } from '../../lib/rotator.js';
2
+ // egg-schedule will load both at app and agent, so we should mount it for compatible
3
+ export default {
4
+ LogRotator,
5
+ };
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL2V4dGVuZC9hZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEQscUZBQXFGO0FBQ3JGLGVBQWU7SUFDYixVQUFVO0NBQ1gsQ0FBQyJ9
@@ -0,0 +1,5 @@
1
+ import { LogRotator } from '../../lib/rotator.js';
2
+ declare const _default: {
3
+ LogRotator: typeof LogRotator;
4
+ };
5
+ export default _default;
@@ -0,0 +1,5 @@
1
+ import { LogRotator } from '../../lib/rotator.js';
2
+ export default {
3
+ LogRotator,
4
+ };
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL2V4dGVuZC9hcHBsaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEQsZUFBZTtJQUNiLFVBQVU7Q0FDWCxDQUFDIn0=
@@ -0,0 +1,9 @@
1
+ import { EggCore } from '@eggjs/core';
2
+ declare const _default: (app: EggCore) => {
3
+ schedule: {
4
+ type: string;
5
+ cron: string;
6
+ };
7
+ task(): Promise<void>;
8
+ };
9
+ export default _default;
@@ -0,0 +1,69 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs/promises';
3
+ import { exists } from 'utility';
4
+ import moment from 'moment';
5
+ import { walkLoggerFile } from '../../lib/utils.js';
6
+ // clean all xxx.log.YYYY-MM-DD before expired date.
7
+ export default (app) => ({
8
+ schedule: {
9
+ type: 'worker', // only one worker run this task
10
+ cron: '0 0 * * *', // run every day at 00:00
11
+ },
12
+ async task() {
13
+ const logger = app.coreLogger;
14
+ const logDirs = new Set();
15
+ const loggerFiles = walkLoggerFile(app.loggers);
16
+ loggerFiles.forEach(file => {
17
+ const logDir = path.dirname(file);
18
+ logDirs.add(logDir);
19
+ });
20
+ const maxDays = app.config.logrotator.maxDays;
21
+ if (maxDays && maxDays > 0) {
22
+ try {
23
+ const tasks = Array.from(logDirs, logDir => removeExpiredLogFiles(logDir, maxDays, logger));
24
+ await Promise.all(tasks);
25
+ }
26
+ catch (err) {
27
+ logger.error(err);
28
+ }
29
+ }
30
+ logger.info('[@eggjs/logrotator] clean all log before %s days', maxDays);
31
+ },
32
+ });
33
+ // remove expired log files: xxx.log.YYYY-MM-DD
34
+ async function removeExpiredLogFiles(logDir, maxDays, logger) {
35
+ // ignore not exists dir
36
+ const stat = await exists(logDir);
37
+ if (!stat) {
38
+ logger.warn(`[@eggjs/logrotator] logDir ${logDir} not exists`);
39
+ return;
40
+ }
41
+ const files = await fs.readdir(logDir);
42
+ const expiredDate = moment().subtract(maxDays, 'days').startOf('date');
43
+ const names = files.filter(file => {
44
+ const name = path.extname(file).substring(1);
45
+ if (!/^\d{4}\-\d{2}\-\d{2}/.test(name)) {
46
+ return false;
47
+ }
48
+ const date = moment(name, 'YYYY-MM-DD').startOf('date');
49
+ if (!date.isValid()) {
50
+ return false;
51
+ }
52
+ return date.isBefore(expiredDate);
53
+ });
54
+ if (names.length === 0) {
55
+ return;
56
+ }
57
+ logger.info(`[@eggjs/logrotator] start remove ${logDir} files: ${names.join(', ')}`);
58
+ await Promise.all(names.map(async (name) => {
59
+ const logFile = path.join(logDir, name);
60
+ try {
61
+ await fs.unlink(logFile);
62
+ }
63
+ catch (err) {
64
+ err.message = `[@eggjs/logrotator] remove logFile ${logFile} error, ${err.message}`;
65
+ logger.error(err);
66
+ }
67
+ }));
68
+ }
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYW5fbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9zY2hlZHVsZS9jbGVhbl9sb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVwRCxvREFBb0Q7QUFDcEQsZUFBZSxDQUFDLEdBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNoQyxRQUFRLEVBQUU7UUFDUixJQUFJLEVBQUUsUUFBUSxFQUFFLGdDQUFnQztRQUNoRCxJQUFJLEVBQUUsV0FBVyxFQUFFLHlCQUF5QjtLQUM3QztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUM5QixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEQsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN6QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDOUMsSUFBSSxPQUFPLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQztnQkFDSCxNQUFNLEtB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
@@ -0,0 +1,10 @@
1
+ import { EggCore } from '@eggjs/core';
2
+ declare const _default: (app: EggCore) => {
3
+ schedule: {
4
+ type: string;
5
+ cron: string;
6
+ disable: boolean;
7
+ };
8
+ task(): Promise<void>;
9
+ };
10
+ export default _default;
@@ -0,0 +1,15 @@
1
+ import { DayRotator } from '../../lib/day_rotator.js';
2
+ export default (app) => {
3
+ const rotator = new DayRotator({ app });
4
+ return {
5
+ schedule: {
6
+ type: 'worker', // only one worker run this task
7
+ cron: '1 0 0 * * *', // run every day at 00:00
8
+ disable: app.config.logrotator.disableRotateByDay,
9
+ },
10
+ async task() {
11
+ await rotator.rotate();
12
+ },
13
+ };
14
+ };
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRlX2J5X2ZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL3NjaGVkdWxlL3JvdGF0ZV9ieV9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV0RCxlQUFlLENBQUMsR0FBWSxFQUFFLEVBQUU7SUFDOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBRXhDLE9BQU87UUFDTCxRQUFRLEVBQUU7WUFDUixJQUFJLEVBQUUsUUFBUSxFQUFFLGdDQUFnQztZQUNoRCxJQUFJLEVBQUUsYUFBYSxFQUFFLHlCQUF5QjtZQUM5QyxPQUFPLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsa0JBQWtCO1NBQ2xEO1FBRUQsS0FBSyxDQUFDLElBQUk7WUFDUixNQUFNLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6QixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
@@ -0,0 +1,10 @@
1
+ import { EggCore } from '@eggjs/core';
2
+ declare const _default: (app: EggCore) => {
3
+ schedule: {
4
+ type: string;
5
+ cron: string;
6
+ disable: boolean;
7
+ };
8
+ task(): Promise<void>;
9
+ };
10
+ export default _default;
@@ -0,0 +1,15 @@
1
+ import { HourRotator } from '../../lib/hour_rotator.js';
2
+ export default (app) => {
3
+ const rotator = new HourRotator({ app });
4
+ return {
5
+ schedule: {
6
+ type: 'worker', // only one worker run this task
7
+ cron: '1 * * * *', // run every hour at 01
8
+ disable: (app.config.logrotator.filesRotateByHour || []).length === 0,
9
+ },
10
+ async task() {
11
+ await rotator.rotate();
12
+ },
13
+ };
14
+ };
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRlX2J5X2hvdXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL3NjaGVkdWxlL3JvdGF0ZV9ieV9ob3VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV4RCxlQUFlLENBQUMsR0FBWSxFQUFFLEVBQUU7SUFDOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBRXpDLE9BQU87UUFDTCxRQUFRLEVBQUU7WUFDUixJQUFJLEVBQUUsUUFBUSxFQUFFLGdDQUFnQztZQUNoRCxJQUFJLEVBQUUsV0FBVyxFQUFFLHVCQUF1QjtZQUMxQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztTQUN0RTtRQUVELEtBQUssQ0FBQyxJQUFJO1lBQ1IsTUFBTSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDekIsQ0FBQztLQUVGLENBQUM7QUFDSixDQUFDLENBQUMifQ==
@@ -0,0 +1,10 @@
1
+ import { EggCore } from '@eggjs/core';
2
+ declare const _default: (app: EggCore) => {
3
+ schedule: {
4
+ type: string;
5
+ interval: number;
6
+ disable: boolean;
7
+ };
8
+ task(): Promise<void>;
9
+ };
10
+ export default _default;
@@ -0,0 +1,15 @@
1
+ import { SizeRotator } from '../../lib/size_rotator.js';
2
+ export default (app) => {
3
+ const rotator = new SizeRotator({ app });
4
+ return {
5
+ schedule: {
6
+ type: 'worker',
7
+ interval: app.config.logrotator.rotateDuration,
8
+ disable: (app.config.logrotator.filesRotateBySize || []).length === 0,
9
+ },
10
+ async task() {
11
+ await rotator.rotate();
12
+ },
13
+ };
14
+ };
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRlX2J5X3NpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL3NjaGVkdWxlL3JvdGF0ZV9ieV9zaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV4RCxlQUFlLENBQUMsR0FBWSxFQUFFLEVBQUU7SUFDOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBRXpDLE9BQU87UUFDTCxRQUFRLEVBQUU7WUFDUixJQUFJLEVBQUUsUUFBUTtZQUNkLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxjQUFjO1lBQzlDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO1NBQ3RFO1FBRUQsS0FBSyxDQUFDLElBQUk7WUFDUixNQUFNLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6QixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
@@ -0,0 +1,2 @@
1
+ import { Boot } from './boot.js';
2
+ export default Boot;
@@ -0,0 +1,3 @@
1
+ import { Boot } from './boot.js';
2
+ export default Boot;
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpDLGVBQWUsSUFBSSxDQUFDIn0=
@@ -0,0 +1,6 @@
1
+ import type { EggCore, ILifecycleBoot } from '@eggjs/core';
2
+ export declare class Boot implements ILifecycleBoot {
3
+ private readonly app;
4
+ constructor(app: EggCore);
5
+ didLoad(): Promise<void>;
6
+ }