@eggjs/logrotator 4.1.0 → 5.0.0-beta.17
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.
- package/README.md +1 -3
- package/README.zh-CN.md +1 -3
- package/dist/agent.d.ts +2 -0
- package/dist/agent.js +7 -0
- package/dist/app/extend/agent.d.ts +8 -0
- package/dist/app/extend/agent.js +7 -0
- package/dist/app/extend/application.d.ts +8 -0
- package/dist/app/extend/application.js +7 -0
- package/dist/app/schedule/clean_log.d.ts +12 -0
- package/dist/app/schedule/clean_log.js +60 -0
- package/dist/app/schedule/rotate_by_file.d.ts +13 -0
- package/dist/app/schedule/rotate_by_file.js +19 -0
- package/dist/app/schedule/rotate_by_hour.d.ts +13 -0
- package/dist/app/schedule/rotate_by_hour.js +19 -0
- package/dist/app/schedule/rotate_by_size.d.ts +13 -0
- package/dist/app/schedule/rotate_by_size.js +19 -0
- package/dist/app.d.ts +2 -0
- package/dist/app.js +7 -0
- package/dist/boot.d.ts +10 -0
- package/dist/boot.js +16 -0
- package/{src/config/config.default.ts → dist/config/config.default.d.ts} +6 -18
- package/dist/config/config.default.js +15 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +5 -0
- package/dist/lib/day_rotator.d.ts +12 -0
- package/dist/lib/day_rotator.js +64 -0
- package/dist/lib/hour_rotator.d.ts +10 -0
- package/dist/lib/hour_rotator.js +38 -0
- package/dist/lib/rotator.d.ts +20 -0
- package/dist/lib/rotator.js +56 -0
- package/dist/lib/size_rotator.d.ts +9 -0
- package/dist/lib/size_rotator.js +61 -0
- package/dist/lib/utils.d.ts +12 -0
- package/dist/lib/utils.js +15 -0
- package/dist/types.d.ts +19 -0
- package/dist/types.js +1 -0
- package/package.json +53 -78
- package/dist/commonjs/agent.d.ts +0 -2
- package/dist/commonjs/agent.js +0 -5
- package/dist/commonjs/app/extend/agent.d.ts +0 -5
- package/dist/commonjs/app/extend/agent.js +0 -8
- package/dist/commonjs/app/extend/application.d.ts +0 -5
- package/dist/commonjs/app/extend/application.js +0 -7
- package/dist/commonjs/app/schedule/clean_log.d.ts +0 -9
- package/dist/commonjs/app/schedule/clean_log.js +0 -75
- package/dist/commonjs/app/schedule/rotate_by_file.d.ts +0 -10
- package/dist/commonjs/app/schedule/rotate_by_file.js +0 -17
- package/dist/commonjs/app/schedule/rotate_by_hour.d.ts +0 -10
- package/dist/commonjs/app/schedule/rotate_by_hour.js +0 -17
- package/dist/commonjs/app/schedule/rotate_by_size.d.ts +0 -10
- package/dist/commonjs/app/schedule/rotate_by_size.js +0 -17
- package/dist/commonjs/app.d.ts +0 -2
- package/dist/commonjs/app.js +0 -5
- package/dist/commonjs/boot.d.ts +0 -6
- package/dist/commonjs/boot.js +0 -18
- package/dist/commonjs/config/config.default.d.ts +0 -64
- package/dist/commonjs/config/config.default.js +0 -16
- package/dist/commonjs/index.d.ts +0 -2
- package/dist/commonjs/index.js +0 -19
- package/dist/commonjs/lib/day_rotator.d.ts +0 -8
- package/dist/commonjs/lib/day_rotator.js +0 -91
- package/dist/commonjs/lib/hour_rotator.d.ts +0 -6
- package/dist/commonjs/lib/hour_rotator.js +0 -50
- package/dist/commonjs/lib/rotator.d.ts +0 -16
- package/dist/commonjs/lib/rotator.js +0 -81
- package/dist/commonjs/lib/size_rotator.d.ts +0 -5
- package/dist/commonjs/lib/size_rotator.js +0 -74
- package/dist/commonjs/lib/utils.d.ts +0 -10
- package/dist/commonjs/lib/utils.js +0 -19
- package/dist/commonjs/package.json +0 -3
- package/dist/commonjs/types.d.ts +0 -11
- package/dist/commonjs/types.js +0 -3
- package/dist/esm/agent.d.ts +0 -2
- package/dist/esm/agent.js +0 -3
- package/dist/esm/app/extend/agent.d.ts +0 -5
- package/dist/esm/app/extend/agent.js +0 -6
- package/dist/esm/app/extend/application.d.ts +0 -5
- package/dist/esm/app/extend/application.js +0 -5
- package/dist/esm/app/schedule/clean_log.d.ts +0 -9
- package/dist/esm/app/schedule/clean_log.js +0 -70
- package/dist/esm/app/schedule/rotate_by_file.d.ts +0 -10
- package/dist/esm/app/schedule/rotate_by_file.js +0 -15
- package/dist/esm/app/schedule/rotate_by_hour.d.ts +0 -10
- package/dist/esm/app/schedule/rotate_by_hour.js +0 -15
- package/dist/esm/app/schedule/rotate_by_size.d.ts +0 -10
- package/dist/esm/app/schedule/rotate_by_size.js +0 -15
- package/dist/esm/app.d.ts +0 -2
- package/dist/esm/app.js +0 -3
- package/dist/esm/boot.d.ts +0 -6
- package/dist/esm/boot.js +0 -14
- package/dist/esm/config/config.default.d.ts +0 -64
- package/dist/esm/config/config.default.js +0 -14
- package/dist/esm/index.d.ts +0 -2
- package/dist/esm/index.js +0 -3
- package/dist/esm/lib/day_rotator.d.ts +0 -8
- package/dist/esm/lib/day_rotator.js +0 -84
- package/dist/esm/lib/hour_rotator.d.ts +0 -6
- package/dist/esm/lib/hour_rotator.js +0 -43
- package/dist/esm/lib/rotator.d.ts +0 -16
- package/dist/esm/lib/rotator.js +0 -74
- package/dist/esm/lib/size_rotator.d.ts +0 -5
- package/dist/esm/lib/size_rotator.js +0 -67
- package/dist/esm/lib/utils.d.ts +0 -10
- package/dist/esm/lib/utils.js +0 -16
- package/dist/esm/package.json +0 -3
- package/dist/esm/types.d.ts +0 -11
- package/dist/esm/types.js +0 -2
- package/dist/package.json +0 -4
- package/src/agent.ts +0 -3
- package/src/app/extend/agent.ts +0 -6
- package/src/app/extend/application.ts +0 -5
- package/src/app/schedule/clean_log.ts +0 -87
- package/src/app/schedule/rotate_by_file.ts +0 -18
- package/src/app/schedule/rotate_by_hour.ts +0 -18
- package/src/app/schedule/rotate_by_size.ts +0 -18
- package/src/app.ts +0 -3
- package/src/boot.ts +0 -16
- package/src/index.ts +0 -3
- package/src/lib/day_rotator.ts +0 -98
- package/src/lib/hour_rotator.ts +0 -52
- package/src/lib/rotator.ts +0 -107
- package/src/lib/size_rotator.ts +0 -75
- package/src/lib/utils.ts +0 -23
- package/src/types.ts +0 -15
- package/src/typings/index.d.ts +0 -4
package/dist/esm/boot.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export class Boot {
|
|
2
|
-
app;
|
|
3
|
-
constructor(app) {
|
|
4
|
-
this.app = app;
|
|
5
|
-
}
|
|
6
|
-
async didLoad() {
|
|
7
|
-
// reload logger to new fd after rotating
|
|
8
|
-
this.app.messenger.on('log-reload', () => {
|
|
9
|
-
this.app.loggers.reload();
|
|
10
|
-
this.app.coreLogger.info('[@eggjs/logrotator] %s logger reload: got log-reload message', this.app.type);
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ib290LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyxJQUFJO0lBQ2M7SUFBN0IsWUFBNkIsR0FBWTtRQUFaLFFBQUcsR0FBSCxHQUFHLENBQVM7SUFBRyxDQUFDO0lBRTdDLEtBQUssQ0FBQyxPQUFPO1FBQ1gseUNBQXlDO1FBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDdEIsOERBQThELEVBQzlELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUNkLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiJ9
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* logrotator options
|
|
3
|
-
* @member Config#logrotator
|
|
4
|
-
*/
|
|
5
|
-
export interface LogrotatorConfig {
|
|
6
|
-
/**
|
|
7
|
-
* Disable rotate by day
|
|
8
|
-
*
|
|
9
|
-
* Default: `false`
|
|
10
|
-
*/
|
|
11
|
-
disableRotateByDay: boolean;
|
|
12
|
-
/**
|
|
13
|
-
* List of files that will be rotated by hour
|
|
14
|
-
*
|
|
15
|
-
* Default: `null`
|
|
16
|
-
*/
|
|
17
|
-
filesRotateByHour: string[] | null;
|
|
18
|
-
/**
|
|
19
|
-
* Hour delimiter
|
|
20
|
-
*
|
|
21
|
-
* Default: `-`
|
|
22
|
-
*/
|
|
23
|
-
hourDelimiter: string;
|
|
24
|
-
/**
|
|
25
|
-
* List of files that will be rotated by size
|
|
26
|
-
*
|
|
27
|
-
* Default: `null`
|
|
28
|
-
*/
|
|
29
|
-
filesRotateBySize: string[] | null;
|
|
30
|
-
/**
|
|
31
|
-
* Max file size to judge if any file need rotate
|
|
32
|
-
*
|
|
33
|
-
* Default: `50 * 1024 * 1024`
|
|
34
|
-
*/
|
|
35
|
-
maxFileSize: number;
|
|
36
|
-
/**
|
|
37
|
-
* Max files to keep
|
|
38
|
-
*
|
|
39
|
-
* Default: `10`
|
|
40
|
-
*/
|
|
41
|
-
maxFiles: number;
|
|
42
|
-
/**
|
|
43
|
-
* Time interval to judge if any file need rotate
|
|
44
|
-
*
|
|
45
|
-
* Default: `60000`
|
|
46
|
-
*/
|
|
47
|
-
rotateDuration: number;
|
|
48
|
-
/**
|
|
49
|
-
* Max days to keep log files, set `0` to keep all logs.
|
|
50
|
-
*
|
|
51
|
-
* Default: `31`
|
|
52
|
-
*/
|
|
53
|
-
maxDays: number;
|
|
54
|
-
/**
|
|
55
|
-
* Enable gzip compression for rotated files
|
|
56
|
-
*
|
|
57
|
-
* Default: `false`
|
|
58
|
-
*/
|
|
59
|
-
gzip: boolean;
|
|
60
|
-
}
|
|
61
|
-
declare const _default: {
|
|
62
|
-
logrotator: LogrotatorConfig;
|
|
63
|
-
};
|
|
64
|
-
export default _default;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
logrotator: {
|
|
3
|
-
disableRotateByDay: false,
|
|
4
|
-
filesRotateByHour: null,
|
|
5
|
-
hourDelimiter: '-',
|
|
6
|
-
filesRotateBySize: null,
|
|
7
|
-
maxFileSize: 50 * 1024 * 1024,
|
|
8
|
-
maxFiles: 10,
|
|
9
|
-
rotateDuration: 60_000,
|
|
10
|
-
maxDays: 31,
|
|
11
|
-
gzip: false,
|
|
12
|
-
},
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmRlZmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29uZmlnL2NvbmZpZy5kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTZEQSxlQUFlO0lBQ2IsVUFBVSxFQUFFO1FBQ1Ysa0JBQWtCLEVBQUUsS0FBSztRQUN6QixpQkFBaUIsRUFBRSxJQUFJO1FBQ3ZCLGFBQWEsRUFBRSxHQUFHO1FBQ2xCLGlCQUFpQixFQUFFLElBQUk7UUFDdkIsV0FBVyxFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSTtRQUM3QixRQUFRLEVBQUUsRUFBRTtRQUNaLGNBQWMsRUFBRSxNQUFNO1FBQ3RCLE9BQU8sRUFBRSxFQUFFO1FBQ1gsSUFBSSxFQUFFLEtBQUs7S0FDUTtDQUN0QixDQUFDIn0=
|
package/dist/esm/index.d.ts
DELETED
package/dist/esm/index.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import './types.js';
|
|
2
|
-
export * from './lib/rotator.js';
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxZQUFZLENBQUM7QUFFcEIsY0FBYyxrQkFBa0IsQ0FBQyJ9
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { LogRotator, type RotateFile, type RotatorOptions } from './rotator.js';
|
|
2
|
-
export declare class DayRotator extends LogRotator {
|
|
3
|
-
private filesRotateBySize;
|
|
4
|
-
private filesRotateByHour;
|
|
5
|
-
constructor(options: RotatorOptions);
|
|
6
|
-
getRotateFiles(): Promise<Map<string, RotateFile>>;
|
|
7
|
-
_setFile(srcPath: string, files: Map<string, RotateFile>): void;
|
|
8
|
-
}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import moment from 'moment';
|
|
3
|
-
import fs from 'node:fs/promises';
|
|
4
|
-
import { debuglog } from 'node:util';
|
|
5
|
-
import { exists } from 'utility';
|
|
6
|
-
import { LogRotator } from './rotator.js';
|
|
7
|
-
import { walkLoggerFile } from './utils.js';
|
|
8
|
-
const debug = debuglog('@eggjs/logrotator/lib/day_rotator');
|
|
9
|
-
// rotate log by day
|
|
10
|
-
// rename from foo.log to foo.log.YYYY-MM-DD
|
|
11
|
-
export class DayRotator extends LogRotator {
|
|
12
|
-
filesRotateBySize;
|
|
13
|
-
filesRotateByHour;
|
|
14
|
-
constructor(options) {
|
|
15
|
-
super(options);
|
|
16
|
-
this.filesRotateBySize = this.app.config.logrotator.filesRotateBySize || [];
|
|
17
|
-
this.filesRotateByHour = this.app.config.logrotator.filesRotateByHour || [];
|
|
18
|
-
}
|
|
19
|
-
async getRotateFiles() {
|
|
20
|
-
const files = new Map();
|
|
21
|
-
const logDir = this.app.config.logger.dir;
|
|
22
|
-
const loggers = this.app.loggers;
|
|
23
|
-
const loggerFiles = walkLoggerFile(loggers);
|
|
24
|
-
for (let file of loggerFiles) {
|
|
25
|
-
// support relative path
|
|
26
|
-
if (!path.isAbsolute(file)) {
|
|
27
|
-
file = path.join(logDir, file);
|
|
28
|
-
}
|
|
29
|
-
this._setFile(file, files);
|
|
30
|
-
}
|
|
31
|
-
// Should rotate agent log, because schedule is running under app worker,
|
|
32
|
-
// agent log is the only difference between app worker and agent worker.
|
|
33
|
-
// - app worker -> egg-web.log
|
|
34
|
-
// - agent worker -> egg-agent.log
|
|
35
|
-
const agentLogName = this.app.config.logger.agentLogName;
|
|
36
|
-
this._setFile(path.join(logDir, agentLogName), files);
|
|
37
|
-
// rotateLogDirs is deprecated
|
|
38
|
-
const rotateLogDirs = this.app.config.logger.rotateLogDirs;
|
|
39
|
-
if (rotateLogDirs && rotateLogDirs.length > 0) {
|
|
40
|
-
this.app.deprecate('[egg-logrotator] Do not use app.config.logger.rotateLogDirs, only rotate core loggers and custom loggers');
|
|
41
|
-
for (const dir of rotateLogDirs) {
|
|
42
|
-
const stat = await exists(dir);
|
|
43
|
-
if (!stat)
|
|
44
|
-
continue;
|
|
45
|
-
try {
|
|
46
|
-
const names = await fs.readdir(dir);
|
|
47
|
-
for (const name of names) {
|
|
48
|
-
if (!name.endsWith('.log')) {
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
this._setFile(path.join(dir, name), files);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
catch (err) {
|
|
55
|
-
this.logger.error(err);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return files;
|
|
60
|
-
}
|
|
61
|
-
_setFile(srcPath, files) {
|
|
62
|
-
// don't rotate logPath in filesRotateBySize
|
|
63
|
-
if (this.filesRotateBySize.includes(srcPath)) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
// don't rotate logPath in filesRotateByHour
|
|
67
|
-
if (this.filesRotateByHour.includes(srcPath)) {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
if (!files.has(srcPath)) {
|
|
71
|
-
const ext = this.app.config.logrotator.gzip === true ? '.gz' : '';
|
|
72
|
-
// allow 2 minutes deviation
|
|
73
|
-
const targetPath = srcPath +
|
|
74
|
-
moment()
|
|
75
|
-
.subtract(23, 'hours')
|
|
76
|
-
.subtract(58, 'minutes')
|
|
77
|
-
.format('.YYYY-MM-DD') +
|
|
78
|
-
ext;
|
|
79
|
-
debug('set file %s => %s', srcPath, targetPath);
|
|
80
|
-
files.set(srcPath, { srcPath, targetPath });
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF5X3JvdGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2RheV9yb3RhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWpDLE9BQU8sRUFBRSxVQUFVLEVBQXdDLE1BQU0sY0FBYyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFNUMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7QUFFNUQsb0JBQW9CO0FBQ3BCLDRDQUE0QztBQUM1QyxNQUFNLE9BQU8sVUFBVyxTQUFRLFVBQVU7SUFDaEMsaUJBQWlCLENBQVc7SUFDNUIsaUJBQWlCLENBQVc7SUFFcEMsWUFBWSxPQUF1QjtRQUNqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztRQUM1RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztJQUM5RSxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWM7UUFDbEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUMxQyxN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
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { LogRotator, type 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
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import moment from 'moment';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { debuglog } from 'node:util';
|
|
4
|
-
import { exists } from 'utility';
|
|
5
|
-
import { LogRotator } from './rotator.js';
|
|
6
|
-
const debug = debuglog('@eggjs/logrotator/lib/hour_rotator');
|
|
7
|
-
// rotate log by hour
|
|
8
|
-
// rename from foo.log to foo.log.YYYY-MM-DD-HH
|
|
9
|
-
export class HourRotator extends LogRotator {
|
|
10
|
-
async getRotateFiles() {
|
|
11
|
-
const files = new Map();
|
|
12
|
-
const logDir = this.app.config.logger.dir;
|
|
13
|
-
const filesRotateByHour = this.app.config.logrotator.filesRotateByHour || [];
|
|
14
|
-
for (let logPath of filesRotateByHour) {
|
|
15
|
-
// support relative path
|
|
16
|
-
if (!path.isAbsolute(logPath)) {
|
|
17
|
-
logPath = path.join(logDir, logPath);
|
|
18
|
-
}
|
|
19
|
-
const stat = await exists(logPath);
|
|
20
|
-
if (!stat) {
|
|
21
|
-
continue;
|
|
22
|
-
}
|
|
23
|
-
this._setFile(logPath, files);
|
|
24
|
-
}
|
|
25
|
-
return files;
|
|
26
|
-
}
|
|
27
|
-
get hourDelimiter() {
|
|
28
|
-
return this.app.config.logrotator.hourDelimiter;
|
|
29
|
-
}
|
|
30
|
-
_setFile(srcPath, files) {
|
|
31
|
-
if (!files.has(srcPath)) {
|
|
32
|
-
const ext = this.app.config.logrotator.gzip === true ? '.gz' : '';
|
|
33
|
-
const targetPath = srcPath +
|
|
34
|
-
moment()
|
|
35
|
-
.subtract(1, 'hours')
|
|
36
|
-
.format(`.YYYY-MM-DD${this.hourDelimiter}HH`) +
|
|
37
|
-
ext;
|
|
38
|
-
debug('set file %s => %s', srcPath, targetPath);
|
|
39
|
-
files.set(srcPath, { srcPath, targetPath });
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG91cl9yb3RhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ob3VyX3JvdGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXJDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFakMsT0FBTyxFQUFFLFVBQVUsRUFBbUIsTUFBTSxjQUFjLENBQUM7QUFFM0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7QUFFN0QscUJBQXFCO0FBQ3JCLCtDQUErQztBQUMvQyxNQUFNLE9BQU8sV0FBWSxTQUFRLFVBQVU7SUFDekMsS0FBSyxDQUFDLGNBQWM7UUFDbEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUMxQyxNQUFNLGlCQUFpQixHQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDO1FBRXJELEtBQUssSUFBSSxPQUFPLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0Qyx3QkFBd0I7WUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7WUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1YsU0FBUztZQUNYLENBQUM7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ2xELENBQUM7SUFFRCxRQUFRLENBQUMsT0FBZSxFQUFFLEtBQThCO1FBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDeEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sVUFBVSxHQUNkLE9BQU87Z0JBQ1AsTUFBTSxFQUFFO3FCQUNMLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO3FCQUNwQixNQUFNLENBQUMsY0FBYyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUM7Z0JBQy9DLEdBQUcsQ0FBQztZQUNOLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDaEQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { 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
|
-
}
|
package/dist/esm/lib/rotator.js
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert';
|
|
2
|
-
import { createWriteStream, createReadStream } from 'node:fs';
|
|
3
|
-
import fs from 'node:fs/promises';
|
|
4
|
-
import { pipeline } from 'node:stream/promises';
|
|
5
|
-
import { createGzip } from 'node:zlib';
|
|
6
|
-
import { debuglog } from 'node:util';
|
|
7
|
-
import { exists } from 'utility';
|
|
8
|
-
const debug = debuglog('@eggjs/logrotator/lib/rotator');
|
|
9
|
-
export class LogRotator {
|
|
10
|
-
options;
|
|
11
|
-
app;
|
|
12
|
-
logger;
|
|
13
|
-
constructor(options) {
|
|
14
|
-
this.options = options;
|
|
15
|
-
assert(this.options.app, 'options.app is required');
|
|
16
|
-
this.app = this.options.app;
|
|
17
|
-
this.logger = this.app.coreLogger;
|
|
18
|
-
}
|
|
19
|
-
async rotate() {
|
|
20
|
-
const files = await this.getRotateFiles();
|
|
21
|
-
assert(files instanceof Map, 'getRotateFiles should return a Map');
|
|
22
|
-
const rotatedFiles = [];
|
|
23
|
-
for (const file of files.values()) {
|
|
24
|
-
try {
|
|
25
|
-
debug('rename from %s to %s', file.srcPath, file.targetPath);
|
|
26
|
-
await renameOrDelete(file.srcPath, file.targetPath, this.app.config.logrotator.gzip);
|
|
27
|
-
rotatedFiles.push(`${file.srcPath} -> ${file.targetPath}`);
|
|
28
|
-
}
|
|
29
|
-
catch (e) {
|
|
30
|
-
const err = e;
|
|
31
|
-
err.message =
|
|
32
|
-
`[@eggjs/logrotator] rename ${file.srcPath}, found exception: ` +
|
|
33
|
-
err.message;
|
|
34
|
-
this.logger.error(err);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
if (rotatedFiles.length > 0) {
|
|
38
|
-
// tell every one to reload logger
|
|
39
|
-
this.logger.info('[@eggjs/logrotator] broadcast log-reload');
|
|
40
|
-
this.app.messenger.sendToApp('log-reload');
|
|
41
|
-
this.app.messenger.sendToAgent('log-reload');
|
|
42
|
-
}
|
|
43
|
-
this.logger.info('[@eggjs/logrotator] rotate files success by %s, files %j', this.constructor.name, rotatedFiles);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
// rename from srcPath to targetPath, for example foo.log.1 > foo.log.2
|
|
47
|
-
// 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
|
|
48
|
-
async function renameOrDelete(srcPath, targetPath, gzip) {
|
|
49
|
-
if (srcPath === targetPath) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
const srcExists = await exists(srcPath);
|
|
53
|
-
if (!srcExists) {
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
const targetExists = await exists(targetPath);
|
|
57
|
-
// if target file exists, then throw
|
|
58
|
-
// because the target file always be renamed first.
|
|
59
|
-
if (targetExists) {
|
|
60
|
-
const err = new Error(`targetFile ${targetPath} exists!!!`);
|
|
61
|
-
throw err;
|
|
62
|
-
}
|
|
63
|
-
// if gzip is true, then use gzip
|
|
64
|
-
if (gzip === true) {
|
|
65
|
-
const tmpPath = `${targetPath}.tmp`;
|
|
66
|
-
await fs.rename(srcPath, tmpPath);
|
|
67
|
-
await pipeline(createReadStream(tmpPath), createGzip(), createWriteStream(targetPath));
|
|
68
|
-
await fs.unlink(tmpPath);
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
await fs.rename(srcPath, targetPath);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcm90YXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlELE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUdqQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQVd4RCxNQUFNLE9BQWdCLFVBQVU7SUFDWCxPQUFPLENBQWlCO0lBQ3hCLEdBQUcsQ0FBVTtJQUNiLE1BQU0sQ0FBd0I7SUFFakQsWUFBWSxPQUF1QjtRQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7SUFDcEMsQ0FBQztJQUlELEtBQUssQ0FBQyxNQUFNO1FBQ1YsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDMUMsTUFBTSxDQUFDLEtBQUssWUFBWSxHQUFHLEVBQUUsb0NBQW9DLENBQUMsQ0FBQztRQUNuRSxNQUFNLFlBQVksR0FBYSxF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
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs/promises';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { debuglog } from 'node:util';
|
|
4
|
-
import { exists } from 'utility';
|
|
5
|
-
import { LogRotator } from './rotator.js';
|
|
6
|
-
const debug = debuglog('@eggjs/logrotator/lib/size_rotator');
|
|
7
|
-
// rotate log by size, if the size of file over maxFileSize,
|
|
8
|
-
// it will rename from foo.log to foo.log.1
|
|
9
|
-
// if foo.log.1 exists, foo.log.1 will rename to foo.log.2
|
|
10
|
-
export class SizeRotator extends LogRotator {
|
|
11
|
-
async getRotateFiles() {
|
|
12
|
-
const files = new Map();
|
|
13
|
-
const logDir = this.app.config.logger.dir;
|
|
14
|
-
const filesRotateBySize = this.app.config.logrotator.filesRotateBySize || [];
|
|
15
|
-
const maxFileSize = this.app.config.logrotator.maxFileSize;
|
|
16
|
-
const maxFiles = this.app.config.logrotator.maxFiles;
|
|
17
|
-
for (let logPath of filesRotateBySize) {
|
|
18
|
-
// support relative path
|
|
19
|
-
if (!path.isAbsolute(logPath)) {
|
|
20
|
-
logPath = path.join(logDir, logPath);
|
|
21
|
-
}
|
|
22
|
-
const stat = await exists(logPath);
|
|
23
|
-
if (!stat) {
|
|
24
|
-
continue;
|
|
25
|
-
}
|
|
26
|
-
const size = stat.size;
|
|
27
|
-
try {
|
|
28
|
-
if (size >= maxFileSize) {
|
|
29
|
-
this.logger.info(`[@eggjs/logrotator] file ${logPath} reach the maximum file size, current size: ${size}, max size: ${maxFileSize}`);
|
|
30
|
-
// delete max log file if exists, otherwise will throw when rename
|
|
31
|
-
const maxFileName = `${logPath}.${maxFiles}`;
|
|
32
|
-
const stat = await exists(maxFileName);
|
|
33
|
-
if (stat) {
|
|
34
|
-
await fs.unlink(maxFileName);
|
|
35
|
-
this.logger.info(`[@eggjs/logrotator] delete max log file ${maxFileName}`);
|
|
36
|
-
}
|
|
37
|
-
this._setFile(logPath, files);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
catch (e) {
|
|
41
|
-
const err = e;
|
|
42
|
-
err.message = '[@eggjs/logrotator] ' + err.message;
|
|
43
|
-
this.logger.error(err);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return files;
|
|
47
|
-
}
|
|
48
|
-
_setFile(logPath, files) {
|
|
49
|
-
const maxFiles = this.app.config.logrotator.maxFiles;
|
|
50
|
-
if (files.has(logPath)) {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
const ext = this.app.config.logrotator.gzip === true ? '.gz' : '';
|
|
54
|
-
// foo.log.2 -> foo.log.3
|
|
55
|
-
// foo.log.1 -> foo.log.2
|
|
56
|
-
for (let i = maxFiles - 1; i >= 1; i--) {
|
|
57
|
-
const srcPath = `${logPath}.${i}`;
|
|
58
|
-
const targetPath = `${logPath}.${i + 1}${ext}`;
|
|
59
|
-
debug('set file %s => %s', srcPath, targetPath);
|
|
60
|
-
files.set(srcPath, { srcPath, targetPath });
|
|
61
|
-
}
|
|
62
|
-
// foo.log -> foo.log.1
|
|
63
|
-
debug('set file %s => %s', logPath, `${logPath}.1`);
|
|
64
|
-
files.set(logPath, { srcPath: logPath, targetPath: `${logPath}.1${ext}` });
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2l6ZV9yb3RhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zaXplX3JvdGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVqQyxPQUFPLEVBQUUsVUFBVSxFQUFtQixNQUFNLGNBQWMsQ0FBQztBQUUzRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsb0NBQW9DLENBQUMsQ0FBQztBQUU3RCw0REFBNEQ7QUFDNUQsMkNBQTJDO0FBQzNDLDBEQUEwRDtBQUMxRCxNQUFNLE9BQU8sV0FBWSxTQUFRLFVBQVU7SUFDekMsS0FBSyxDQUFDLGNBQWM7UUFDbEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUMxQyxNQUFNLGlCQUFpQixHQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDO1FBQ3JELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDM0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUNyRCxLQUFLLElBQUksT0FBTyxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEMsd0JBQXdCO1lBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNWLFNBQVM7WUFDWCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN2QixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxJQUFJLElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLDRCQUE0QixPQUFPLCtDQUErQyxJQUFJLGVBQWUsV0FBVyxFQUFFLENBQ25ILENBQUM7b0JBQ0Ysa0VBQWtFO29CQUNsRSxNQUFNLFdBQVcsR0FBRyxHQUFHLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDN0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3ZDLElBQUksSUFBSSxFQUFFLENBQUM7d0JBQ1QsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDZCwyQ0FBMkMsV0FBVyxFQUFFLENBQ3pELENBQUM7b0JBQ0osQ0FBQztvQkFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDaEMsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLE1BQU0sR0FBRyxHQUFHLENBQVUsQ0FBQztnQkFDdkIsR0FBRyxDQUFDLE9BQU8sR0FBRyxzQkFBc0IsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFFBQVEsQ0FBQyxPQUFlLEVBQUUsS0FBOEI7UUFDdEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUNyRCxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN2QixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRSx5QkFBeUI7UUFDekIseUJBQXlCO1FBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdkMsTUFBTSxPQUFPLEdBQUcsR0FBRyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbEMsTUFBTSxVQUFVLEdBQUcsR0FBRyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUMvQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ2hELEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELHVCQUF1QjtRQUN2QixLQUFLLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxJQUFJLENBQUMsQ0FBQztRQUNwRCxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxLQUFLLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM3RSxDQUFDO0NBQ0YifQ==
|
package/dist/esm/lib/utils.d.ts
DELETED
package/dist/esm/lib/utils.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Walk all logger files from loggers
|
|
3
|
-
*/
|
|
4
|
-
export function walkLoggerFile(loggers) {
|
|
5
|
-
const files = [];
|
|
6
|
-
for (const registeredLogger of Object.values(loggers)) {
|
|
7
|
-
for (const transport of registeredLogger.values()) {
|
|
8
|
-
const file = transport.options.file;
|
|
9
|
-
if (file) {
|
|
10
|
-
files.push(file);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
return files;
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsT0FBcUQ7SUFFckQsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQzNCLEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdEQsS0FBSyxNQUFNLFNBQVMsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ2xELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ3BDLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMifQ==
|
package/dist/esm/package.json
DELETED
package/dist/esm/types.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
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
|
-
}
|
package/dist/esm/types.js
DELETED
package/dist/package.json
DELETED
package/src/agent.ts
DELETED
package/src/app/extend/agent.ts
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import fs from 'node:fs/promises';
|
|
3
|
-
|
|
4
|
-
import { exists } from 'utility';
|
|
5
|
-
import moment from 'moment';
|
|
6
|
-
import type { EggCore } from '@eggjs/core';
|
|
7
|
-
|
|
8
|
-
import { walkLoggerFile } from '../../lib/utils.js';
|
|
9
|
-
|
|
10
|
-
// clean all xxx.log.YYYY-MM-DD before expired date.
|
|
11
|
-
export default (app: EggCore) => ({
|
|
12
|
-
schedule: {
|
|
13
|
-
type: 'worker', // only one worker run this task
|
|
14
|
-
cron: '0 0 * * *', // run every day at 00:00
|
|
15
|
-
},
|
|
16
|
-
|
|
17
|
-
async task() {
|
|
18
|
-
const logger = app.coreLogger;
|
|
19
|
-
const logDirs = new Set<string>();
|
|
20
|
-
const loggerFiles = walkLoggerFile(app.loggers);
|
|
21
|
-
for (const file of loggerFiles) {
|
|
22
|
-
const logDir = path.dirname(file);
|
|
23
|
-
logDirs.add(logDir);
|
|
24
|
-
}
|
|
25
|
-
const maxDays = app.config.logrotator.maxDays;
|
|
26
|
-
if (maxDays && maxDays > 0) {
|
|
27
|
-
try {
|
|
28
|
-
const tasks = Array.from(logDirs, logDir =>
|
|
29
|
-
removeExpiredLogFiles(logDir, maxDays, logger)
|
|
30
|
-
);
|
|
31
|
-
await Promise.all(tasks);
|
|
32
|
-
} catch (err) {
|
|
33
|
-
logger.error(err);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
logger.info('[@eggjs/logrotator] clean all log before %s days', maxDays);
|
|
38
|
-
},
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
// remove expired log files: xxx.log.YYYY-MM-DD
|
|
42
|
-
async function removeExpiredLogFiles(
|
|
43
|
-
logDir: string,
|
|
44
|
-
maxDays: number,
|
|
45
|
-
logger: EggCore['coreLogger']
|
|
46
|
-
) {
|
|
47
|
-
// ignore not exists dir
|
|
48
|
-
const stat = await exists(logDir);
|
|
49
|
-
if (!stat) {
|
|
50
|
-
logger.warn(`[@eggjs/logrotator] logDir ${logDir} not exists`);
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const files = await fs.readdir(logDir);
|
|
55
|
-
const expiredDate = moment().subtract(maxDays, 'days').startOf('date');
|
|
56
|
-
const names = files.filter(file => {
|
|
57
|
-
const name = path.extname(file).slice(1);
|
|
58
|
-
if (!/^\d{4}-\d{2}-\d{2}/.test(name)) {
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
const date = moment(name, 'YYYY-MM-DD').startOf('date');
|
|
62
|
-
if (!date.isValid()) {
|
|
63
|
-
return false;
|
|
64
|
-
}
|
|
65
|
-
return date.isBefore(expiredDate);
|
|
66
|
-
});
|
|
67
|
-
if (names.length === 0) {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
logger.info(
|
|
72
|
-
`[@eggjs/logrotator] start remove ${logDir} files: ${names.join(', ')}`
|
|
73
|
-
);
|
|
74
|
-
|
|
75
|
-
await Promise.all(
|
|
76
|
-
names.map(async name => {
|
|
77
|
-
const logFile = path.join(logDir, name);
|
|
78
|
-
try {
|
|
79
|
-
await fs.unlink(logFile);
|
|
80
|
-
} catch (e) {
|
|
81
|
-
const err = e as Error;
|
|
82
|
-
err.message = `[@eggjs/logrotator] remove logFile ${logFile} error, ${err.message}`;
|
|
83
|
-
logger.error(err);
|
|
84
|
-
}
|
|
85
|
-
})
|
|
86
|
-
);
|
|
87
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { EggCore } from '@eggjs/core';
|
|
2
|
-
import { DayRotator } from '../../lib/day_rotator.js';
|
|
3
|
-
|
|
4
|
-
export default (app: EggCore) => {
|
|
5
|
-
const rotator = new DayRotator({ app });
|
|
6
|
-
|
|
7
|
-
return {
|
|
8
|
-
schedule: {
|
|
9
|
-
type: 'worker', // only one worker run this task
|
|
10
|
-
cron: '1 0 0 * * *', // run every day at 00:00
|
|
11
|
-
disable: app.config.logrotator.disableRotateByDay,
|
|
12
|
-
},
|
|
13
|
-
|
|
14
|
-
async task() {
|
|
15
|
-
await rotator.rotate();
|
|
16
|
-
},
|
|
17
|
-
};
|
|
18
|
-
};
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { EggCore } from '@eggjs/core';
|
|
2
|
-
import { HourRotator } from '../../lib/hour_rotator.js';
|
|
3
|
-
|
|
4
|
-
export default (app: EggCore) => {
|
|
5
|
-
const rotator = new HourRotator({ app });
|
|
6
|
-
|
|
7
|
-
return {
|
|
8
|
-
schedule: {
|
|
9
|
-
type: 'worker', // only one worker run this task
|
|
10
|
-
cron: '1 * * * *', // run every hour at 01
|
|
11
|
-
disable: (app.config.logrotator.filesRotateByHour || []).length === 0,
|
|
12
|
-
},
|
|
13
|
-
|
|
14
|
-
async task() {
|
|
15
|
-
await rotator.rotate();
|
|
16
|
-
},
|
|
17
|
-
};
|
|
18
|
-
};
|