@eggjs/logrotator 4.0.0 → 4.1.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.
- package/README.md +9 -9
- package/README.zh-CN.md +10 -10
- package/dist/commonjs/app/schedule/clean_log.d.ts +1 -1
- package/dist/commonjs/app/schedule/clean_log.js +7 -6
- package/dist/commonjs/app/schedule/rotate_by_file.d.ts +1 -1
- package/dist/commonjs/app/schedule/rotate_by_hour.d.ts +1 -1
- package/dist/commonjs/app/schedule/rotate_by_hour.js +1 -1
- package/dist/commonjs/app/schedule/rotate_by_size.d.ts +1 -1
- package/dist/commonjs/boot.js +1 -1
- package/dist/commonjs/config/config.default.js +2 -2
- package/dist/commonjs/lib/day_rotator.d.ts +1 -1
- package/dist/commonjs/lib/day_rotator.js +11 -9
- package/dist/commonjs/lib/hour_rotator.d.ts +1 -1
- package/dist/commonjs/lib/hour_rotator.js +6 -2
- package/dist/commonjs/lib/rotator.d.ts +1 -1
- package/dist/commonjs/lib/rotator.js +7 -4
- package/dist/commonjs/lib/size_rotator.d.ts +1 -1
- package/dist/commonjs/lib/size_rotator.js +3 -2
- package/dist/commonjs/lib/utils.d.ts +0 -1
- package/dist/commonjs/lib/utils.js +2 -7
- package/dist/esm/app/schedule/clean_log.d.ts +1 -1
- package/dist/esm/app/schedule/clean_log.js +7 -6
- package/dist/esm/app/schedule/rotate_by_file.d.ts +1 -1
- package/dist/esm/app/schedule/rotate_by_hour.d.ts +1 -1
- package/dist/esm/app/schedule/rotate_by_hour.js +1 -1
- package/dist/esm/app/schedule/rotate_by_size.d.ts +1 -1
- package/dist/esm/boot.js +1 -1
- package/dist/esm/config/config.default.js +2 -2
- package/dist/esm/lib/day_rotator.d.ts +1 -1
- package/dist/esm/lib/day_rotator.js +11 -9
- package/dist/esm/lib/hour_rotator.d.ts +1 -1
- package/dist/esm/lib/hour_rotator.js +6 -2
- package/dist/esm/lib/rotator.d.ts +1 -1
- package/dist/esm/lib/rotator.js +7 -4
- package/dist/esm/lib/size_rotator.d.ts +1 -1
- package/dist/esm/lib/size_rotator.js +3 -2
- package/dist/esm/lib/utils.d.ts +0 -1
- package/dist/esm/lib/utils.js +2 -7
- package/dist/package.json +1 -1
- package/package.json +17 -7
- package/src/app/schedule/clean_log.ts +30 -17
- package/src/app/schedule/rotate_by_file.ts +1 -1
- package/src/app/schedule/rotate_by_hour.ts +1 -2
- package/src/app/schedule/rotate_by_size.ts +1 -1
- package/src/boot.ts +4 -1
- package/src/config/config.default.ts +1 -1
- package/src/lib/day_rotator.ts +17 -10
- package/src/lib/hour_rotator.ts +11 -3
- package/src/lib/rotator.ts +28 -9
- package/src/lib/size_rotator.ts +13 -5
- package/src/lib/utils.ts +4 -7
|
@@ -30,10 +30,14 @@ export class HourRotator extends LogRotator {
|
|
|
30
30
|
_setFile(srcPath, files) {
|
|
31
31
|
if (!files.has(srcPath)) {
|
|
32
32
|
const ext = this.app.config.logrotator.gzip === true ? '.gz' : '';
|
|
33
|
-
const targetPath = srcPath +
|
|
33
|
+
const targetPath = srcPath +
|
|
34
|
+
moment()
|
|
35
|
+
.subtract(1, 'hours')
|
|
36
|
+
.format(`.YYYY-MM-DD${this.hourDelimiter}HH`) +
|
|
37
|
+
ext;
|
|
34
38
|
debug('set file %s => %s', srcPath, targetPath);
|
|
35
39
|
files.set(srcPath, { srcPath, targetPath });
|
|
36
40
|
}
|
|
37
41
|
}
|
|
38
42
|
}
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG91cl9yb3RhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ob3VyX3JvdGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXJDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFakMsT0FBTyxFQUFFLFVBQVUsRUFBbUIsTUFBTSxjQUFjLENBQUM7QUFFM0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7QUFFN0QscUJBQXFCO0FBQ3JCLCtDQUErQztBQUMvQyxNQUFNLE9BQU8sV0FBWSxTQUFRLFVBQVU7SUFDekMsS0FBSyxDQUFDLGNBQWM7UUFDbEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUMxQyxNQUFNLGlCQUFpQixHQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDO1FBRXJELEtBQUssSUFBSSxPQUFPLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0Qyx3QkFBd0I7WUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7WUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1YsU0FBUztZQUNYLENBQUM7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ2xELENBQUM7SUFFRCxRQUFRLENBQUMsT0FBZSxFQUFFLEtBQThCO1FBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDeEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sVUFBVSxHQUNkLE9BQU87Z0JBQ1AsTUFBTSxFQUFFO3FCQUNMLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO3FCQUNwQixNQUFNLENBQUMsY0FBYyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUM7Z0JBQy9DLEdBQUcsQ0FBQztZQUNOLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDaEQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
|
package/dist/esm/lib/rotator.js
CHANGED
|
@@ -26,12 +26,15 @@ export class LogRotator {
|
|
|
26
26
|
await renameOrDelete(file.srcPath, file.targetPath, this.app.config.logrotator.gzip);
|
|
27
27
|
rotatedFiles.push(`${file.srcPath} -> ${file.targetPath}`);
|
|
28
28
|
}
|
|
29
|
-
catch (
|
|
30
|
-
err
|
|
29
|
+
catch (e) {
|
|
30
|
+
const err = e;
|
|
31
|
+
err.message =
|
|
32
|
+
`[@eggjs/logrotator] rename ${file.srcPath}, found exception: ` +
|
|
33
|
+
err.message;
|
|
31
34
|
this.logger.error(err);
|
|
32
35
|
}
|
|
33
36
|
}
|
|
34
|
-
if (rotatedFiles.length) {
|
|
37
|
+
if (rotatedFiles.length > 0) {
|
|
35
38
|
// tell every one to reload logger
|
|
36
39
|
this.logger.info('[@eggjs/logrotator] broadcast log-reload');
|
|
37
40
|
this.app.messenger.sendToApp('log-reload');
|
|
@@ -68,4 +71,4 @@ async function renameOrDelete(srcPath, targetPath, gzip) {
|
|
|
68
71
|
await fs.rename(srcPath, targetPath);
|
|
69
72
|
}
|
|
70
73
|
}
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcm90YXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlELE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUdqQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQVd4RCxNQUFNLE9BQWdCLFVBQVU7SUFDWCxPQUFPLENBQWlCO0lBQ3hCLEdBQUcsQ0FBVTtJQUNiLE1BQU0sQ0FBd0I7SUFFakQsWUFBWSxPQUF1QjtRQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7SUFDcEMsQ0FBQztJQUlELEtBQUssQ0FBQyxNQUFNO1FBQ1YsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDMUMsTUFBTSxDQUFDLEtBQUssWUFBWSxHQUFHLEVBQUUsb0NBQW9DLENBQUMsQ0FBQztRQUNuRSxNQUFNLFlBQVksR0FBYSxF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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LogRotator, RotateFile } from './rotator.js';
|
|
1
|
+
import { LogRotator, type RotateFile } from './rotator.js';
|
|
2
2
|
export declare class SizeRotator extends LogRotator {
|
|
3
3
|
getRotateFiles(): Promise<Map<string, RotateFile>>;
|
|
4
4
|
_setFile(logPath: string, files: Map<string, RotateFile>): void;
|
|
@@ -37,7 +37,8 @@ export class SizeRotator extends LogRotator {
|
|
|
37
37
|
this._setFile(logPath, files);
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
-
catch (
|
|
40
|
+
catch (e) {
|
|
41
|
+
const err = e;
|
|
41
42
|
err.message = '[@eggjs/logrotator] ' + err.message;
|
|
42
43
|
this.logger.error(err);
|
|
43
44
|
}
|
|
@@ -63,4 +64,4 @@ export class SizeRotator extends LogRotator {
|
|
|
63
64
|
files.set(logPath, { srcPath: logPath, targetPath: `${logPath}.1${ext}` });
|
|
64
65
|
}
|
|
65
66
|
}
|
|
66
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2l6ZV9yb3RhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zaXplX3JvdGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVqQyxPQUFPLEVBQUUsVUFBVSxFQUFtQixNQUFNLGNBQWMsQ0FBQztBQUUzRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsb0NBQW9DLENBQUMsQ0FBQztBQUU3RCw0REFBNEQ7QUFDNUQsMkNBQTJDO0FBQzNDLDBEQUEwRDtBQUMxRCxNQUFNLE9BQU8sV0FBWSxTQUFRLFVBQVU7SUFDekMsS0FBSyxDQUFDLGNBQWM7UUFDbEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUMxQyxNQUFNLGlCQUFpQixHQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDO1FBQ3JELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDM0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUNyRCxLQUFLLElBQUksT0FBTyxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEMsd0JBQXdCO1lBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENB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
|
package/dist/esm/lib/utils.d.ts
CHANGED
package/dist/esm/lib/utils.js
CHANGED
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Walk all logger files from loggers
|
|
3
|
-
* @param loggers - The loggers to walk
|
|
4
3
|
*/
|
|
5
4
|
export function walkLoggerFile(loggers) {
|
|
6
5
|
const files = [];
|
|
7
|
-
for (const
|
|
8
|
-
if (!loggers.hasOwnProperty(key)) {
|
|
9
|
-
continue;
|
|
10
|
-
}
|
|
11
|
-
const registeredLogger = loggers[key];
|
|
6
|
+
for (const registeredLogger of Object.values(loggers)) {
|
|
12
7
|
for (const transport of registeredLogger.values()) {
|
|
13
8
|
const file = transport.options.file;
|
|
14
9
|
if (file) {
|
|
@@ -18,4 +13,4 @@ export function walkLoggerFile(loggers) {
|
|
|
18
13
|
}
|
|
19
14
|
return files;
|
|
20
15
|
}
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsT0FBcUQ7SUFFckQsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQzNCLEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdEQsS0FBSyxNQUFNLFNBQVMsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ2xELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ3BDLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMifQ==
|
package/dist/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eggjs/logrotator",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -42,16 +42,18 @@
|
|
|
42
42
|
"utility": "^2.5.0"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@arethetypeswrong/cli": "^0.17.
|
|
45
|
+
"@arethetypeswrong/cli": "^0.17.4",
|
|
46
46
|
"@eggjs/bin": "7",
|
|
47
|
-
"@eggjs/mock": "^6.0.
|
|
47
|
+
"@eggjs/mock": "^6.0.6",
|
|
48
48
|
"@eggjs/tsconfig": "1",
|
|
49
49
|
"@types/mocha": "10",
|
|
50
50
|
"@types/node": "22",
|
|
51
51
|
"egg": "^4.0.5",
|
|
52
52
|
"egg-logger": "^3.6.1",
|
|
53
|
-
"
|
|
54
|
-
"
|
|
53
|
+
"husky": "9",
|
|
54
|
+
"lint-staged": "15",
|
|
55
|
+
"oxlint": "^0.16.2",
|
|
56
|
+
"prettier": "3",
|
|
55
57
|
"glob": "^11.0.1",
|
|
56
58
|
"rimraf": "6",
|
|
57
59
|
"snap-shot-it": "^7.9.10",
|
|
@@ -61,7 +63,7 @@
|
|
|
61
63
|
"typescript": "5"
|
|
62
64
|
},
|
|
63
65
|
"scripts": {
|
|
64
|
-
"lint": "
|
|
66
|
+
"lint": "oxlint",
|
|
65
67
|
"pretest": "npm run clean && npm run lint -- --fix",
|
|
66
68
|
"test": "egg-bin test",
|
|
67
69
|
"test:snapshot:update": "SNAPSHOT_UPDATE=1 egg-bin test",
|
|
@@ -69,7 +71,15 @@
|
|
|
69
71
|
"ci": "egg-bin cov",
|
|
70
72
|
"postci": "npm run prepublishOnly && npm run clean",
|
|
71
73
|
"clean": "rimraf dist",
|
|
72
|
-
"prepublishOnly": "tshy && tshy-after && attw --pack"
|
|
74
|
+
"prepublishOnly": "tshy && tshy-after && attw --pack",
|
|
75
|
+
"prepare": "husky"
|
|
76
|
+
},
|
|
77
|
+
"lint-staged": {
|
|
78
|
+
"*": "prettier --write --ignore-unknown --cache",
|
|
79
|
+
"*.{ts,js,json,md,yml}": [
|
|
80
|
+
"prettier --ignore-unknown --write",
|
|
81
|
+
"oxlint --fix"
|
|
82
|
+
]
|
|
73
83
|
},
|
|
74
84
|
"type": "module",
|
|
75
85
|
"tshy": {
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import fs from 'node:fs/promises';
|
|
3
|
+
|
|
3
4
|
import { exists } from 'utility';
|
|
4
5
|
import moment from 'moment';
|
|
5
|
-
import { EggCore } from '@eggjs/core';
|
|
6
|
+
import type { EggCore } from '@eggjs/core';
|
|
7
|
+
|
|
6
8
|
import { walkLoggerFile } from '../../lib/utils.js';
|
|
7
9
|
|
|
8
10
|
// clean all xxx.log.YYYY-MM-DD before expired date.
|
|
@@ -16,14 +18,16 @@ export default (app: EggCore) => ({
|
|
|
16
18
|
const logger = app.coreLogger;
|
|
17
19
|
const logDirs = new Set<string>();
|
|
18
20
|
const loggerFiles = walkLoggerFile(app.loggers);
|
|
19
|
-
|
|
21
|
+
for (const file of loggerFiles) {
|
|
20
22
|
const logDir = path.dirname(file);
|
|
21
23
|
logDirs.add(logDir);
|
|
22
|
-
}
|
|
24
|
+
}
|
|
23
25
|
const maxDays = app.config.logrotator.maxDays;
|
|
24
26
|
if (maxDays && maxDays > 0) {
|
|
25
27
|
try {
|
|
26
|
-
const tasks = Array.from(logDirs, logDir =>
|
|
28
|
+
const tasks = Array.from(logDirs, logDir =>
|
|
29
|
+
removeExpiredLogFiles(logDir, maxDays, logger)
|
|
30
|
+
);
|
|
27
31
|
await Promise.all(tasks);
|
|
28
32
|
} catch (err) {
|
|
29
33
|
logger.error(err);
|
|
@@ -35,7 +39,11 @@ export default (app: EggCore) => ({
|
|
|
35
39
|
});
|
|
36
40
|
|
|
37
41
|
// remove expired log files: xxx.log.YYYY-MM-DD
|
|
38
|
-
async function removeExpiredLogFiles(
|
|
42
|
+
async function removeExpiredLogFiles(
|
|
43
|
+
logDir: string,
|
|
44
|
+
maxDays: number,
|
|
45
|
+
logger: EggCore['coreLogger']
|
|
46
|
+
) {
|
|
39
47
|
// ignore not exists dir
|
|
40
48
|
const stat = await exists(logDir);
|
|
41
49
|
if (!stat) {
|
|
@@ -46,8 +54,8 @@ async function removeExpiredLogFiles(logDir: string, maxDays: number, logger: Eg
|
|
|
46
54
|
const files = await fs.readdir(logDir);
|
|
47
55
|
const expiredDate = moment().subtract(maxDays, 'days').startOf('date');
|
|
48
56
|
const names = files.filter(file => {
|
|
49
|
-
const name = path.extname(file).
|
|
50
|
-
if (!/^\d{4}
|
|
57
|
+
const name = path.extname(file).slice(1);
|
|
58
|
+
if (!/^\d{4}-\d{2}-\d{2}/.test(name)) {
|
|
51
59
|
return false;
|
|
52
60
|
}
|
|
53
61
|
const date = moment(name, 'YYYY-MM-DD').startOf('date');
|
|
@@ -60,15 +68,20 @@ async function removeExpiredLogFiles(logDir: string, maxDays: number, logger: Eg
|
|
|
60
68
|
return;
|
|
61
69
|
}
|
|
62
70
|
|
|
63
|
-
logger.info(
|
|
71
|
+
logger.info(
|
|
72
|
+
`[@eggjs/logrotator] start remove ${logDir} files: ${names.join(', ')}`
|
|
73
|
+
);
|
|
64
74
|
|
|
65
|
-
await Promise.all(
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
+
);
|
|
74
87
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EggCore } from '@eggjs/core';
|
|
1
|
+
import type { EggCore } from '@eggjs/core';
|
|
2
2
|
import { HourRotator } from '../../lib/hour_rotator.js';
|
|
3
3
|
|
|
4
4
|
export default (app: EggCore) => {
|
|
@@ -14,6 +14,5 @@ export default (app: EggCore) => {
|
|
|
14
14
|
async task() {
|
|
15
15
|
await rotator.rotate();
|
|
16
16
|
},
|
|
17
|
-
|
|
18
17
|
};
|
|
19
18
|
};
|
package/src/boot.ts
CHANGED
|
@@ -7,7 +7,10 @@ export class Boot implements ILifecycleBoot {
|
|
|
7
7
|
// reload logger to new fd after rotating
|
|
8
8
|
this.app.messenger.on('log-reload', () => {
|
|
9
9
|
this.app.loggers.reload();
|
|
10
|
-
this.app.coreLogger.info(
|
|
10
|
+
this.app.coreLogger.info(
|
|
11
|
+
'[@eggjs/logrotator] %s logger reload: got log-reload message',
|
|
12
|
+
this.app.type
|
|
13
|
+
);
|
|
11
14
|
});
|
|
12
15
|
}
|
|
13
16
|
}
|
package/src/lib/day_rotator.ts
CHANGED
|
@@ -2,8 +2,10 @@ import path from 'node:path';
|
|
|
2
2
|
import moment from 'moment';
|
|
3
3
|
import fs from 'node:fs/promises';
|
|
4
4
|
import { debuglog } from 'node:util';
|
|
5
|
+
|
|
5
6
|
import { exists } from 'utility';
|
|
6
|
-
|
|
7
|
+
|
|
8
|
+
import { LogRotator, type RotateFile, type RotatorOptions } from './rotator.js';
|
|
7
9
|
import { walkLoggerFile } from './utils.js';
|
|
8
10
|
|
|
9
11
|
const debug = debuglog('@eggjs/logrotator/lib/day_rotator');
|
|
@@ -25,13 +27,13 @@ export class DayRotator extends LogRotator {
|
|
|
25
27
|
const logDir = this.app.config.logger.dir;
|
|
26
28
|
const loggers = this.app.loggers;
|
|
27
29
|
const loggerFiles = walkLoggerFile(loggers);
|
|
28
|
-
|
|
30
|
+
for (let file of loggerFiles) {
|
|
29
31
|
// support relative path
|
|
30
32
|
if (!path.isAbsolute(file)) {
|
|
31
33
|
file = path.join(logDir, file);
|
|
32
34
|
}
|
|
33
35
|
this._setFile(file, files);
|
|
34
|
-
}
|
|
36
|
+
}
|
|
35
37
|
|
|
36
38
|
// Should rotate agent log, because schedule is running under app worker,
|
|
37
39
|
// agent log is the only difference between app worker and agent worker.
|
|
@@ -43,7 +45,9 @@ export class DayRotator extends LogRotator {
|
|
|
43
45
|
// rotateLogDirs is deprecated
|
|
44
46
|
const rotateLogDirs = this.app.config.logger.rotateLogDirs;
|
|
45
47
|
if (rotateLogDirs && rotateLogDirs.length > 0) {
|
|
46
|
-
this.app.deprecate(
|
|
48
|
+
this.app.deprecate(
|
|
49
|
+
'[egg-logrotator] Do not use app.config.logger.rotateLogDirs, only rotate core loggers and custom loggers'
|
|
50
|
+
);
|
|
47
51
|
|
|
48
52
|
for (const dir of rotateLogDirs) {
|
|
49
53
|
const stat = await exists(dir);
|
|
@@ -68,22 +72,25 @@ export class DayRotator extends LogRotator {
|
|
|
68
72
|
|
|
69
73
|
_setFile(srcPath: string, files: Map<string, RotateFile>) {
|
|
70
74
|
// don't rotate logPath in filesRotateBySize
|
|
71
|
-
if (this.filesRotateBySize.
|
|
75
|
+
if (this.filesRotateBySize.includes(srcPath)) {
|
|
72
76
|
return;
|
|
73
77
|
}
|
|
74
78
|
|
|
75
79
|
// don't rotate logPath in filesRotateByHour
|
|
76
|
-
if (this.filesRotateByHour.
|
|
80
|
+
if (this.filesRotateByHour.includes(srcPath)) {
|
|
77
81
|
return;
|
|
78
82
|
}
|
|
79
83
|
|
|
80
84
|
if (!files.has(srcPath)) {
|
|
81
85
|
const ext = this.app.config.logrotator.gzip === true ? '.gz' : '';
|
|
82
86
|
// allow 2 minutes deviation
|
|
83
|
-
const targetPath =
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
+
const targetPath =
|
|
88
|
+
srcPath +
|
|
89
|
+
moment()
|
|
90
|
+
.subtract(23, 'hours')
|
|
91
|
+
.subtract(58, 'minutes')
|
|
92
|
+
.format('.YYYY-MM-DD') +
|
|
93
|
+
ext;
|
|
87
94
|
debug('set file %s => %s', srcPath, targetPath);
|
|
88
95
|
files.set(srcPath, { srcPath, targetPath });
|
|
89
96
|
}
|
package/src/lib/hour_rotator.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import moment from 'moment';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { debuglog } from 'node:util';
|
|
4
|
+
|
|
4
5
|
import { exists } from 'utility';
|
|
5
|
-
|
|
6
|
+
|
|
7
|
+
import { LogRotator, type RotateFile } from './rotator.js';
|
|
6
8
|
|
|
7
9
|
const debug = debuglog('@eggjs/logrotator/lib/hour_rotator');
|
|
8
10
|
|
|
@@ -12,7 +14,8 @@ export class HourRotator extends LogRotator {
|
|
|
12
14
|
async getRotateFiles() {
|
|
13
15
|
const files = new Map<string, RotateFile>();
|
|
14
16
|
const logDir = this.app.config.logger.dir;
|
|
15
|
-
const filesRotateByHour =
|
|
17
|
+
const filesRotateByHour =
|
|
18
|
+
this.app.config.logrotator.filesRotateByHour || [];
|
|
16
19
|
|
|
17
20
|
for (let logPath of filesRotateByHour) {
|
|
18
21
|
// support relative path
|
|
@@ -36,7 +39,12 @@ export class HourRotator extends LogRotator {
|
|
|
36
39
|
_setFile(srcPath: string, files: Map<string, RotateFile>) {
|
|
37
40
|
if (!files.has(srcPath)) {
|
|
38
41
|
const ext = this.app.config.logrotator.gzip === true ? '.gz' : '';
|
|
39
|
-
const targetPath =
|
|
42
|
+
const targetPath =
|
|
43
|
+
srcPath +
|
|
44
|
+
moment()
|
|
45
|
+
.subtract(1, 'hours')
|
|
46
|
+
.format(`.YYYY-MM-DD${this.hourDelimiter}HH`) +
|
|
47
|
+
ext;
|
|
40
48
|
debug('set file %s => %s', srcPath, targetPath);
|
|
41
49
|
files.set(srcPath, { srcPath, targetPath });
|
|
42
50
|
}
|
package/src/lib/rotator.ts
CHANGED
|
@@ -4,8 +4,9 @@ import fs from 'node:fs/promises';
|
|
|
4
4
|
import { pipeline } from 'node:stream/promises';
|
|
5
5
|
import { createGzip } from 'node:zlib';
|
|
6
6
|
import { debuglog } from 'node:util';
|
|
7
|
+
|
|
7
8
|
import { exists } from 'utility';
|
|
8
|
-
import { EggCore } from '@eggjs/core';
|
|
9
|
+
import type { EggCore } from '@eggjs/core';
|
|
9
10
|
|
|
10
11
|
const debug = debuglog('@eggjs/logrotator/lib/rotator');
|
|
11
12
|
|
|
@@ -39,29 +40,43 @@ export abstract class LogRotator {
|
|
|
39
40
|
for (const file of files.values()) {
|
|
40
41
|
try {
|
|
41
42
|
debug('rename from %s to %s', file.srcPath, file.targetPath);
|
|
42
|
-
await renameOrDelete(
|
|
43
|
+
await renameOrDelete(
|
|
44
|
+
file.srcPath,
|
|
45
|
+
file.targetPath,
|
|
46
|
+
this.app.config.logrotator.gzip
|
|
47
|
+
);
|
|
43
48
|
rotatedFiles.push(`${file.srcPath} -> ${file.targetPath}`);
|
|
44
|
-
} catch (
|
|
45
|
-
err
|
|
49
|
+
} catch (e) {
|
|
50
|
+
const err = e as Error;
|
|
51
|
+
err.message =
|
|
52
|
+
`[@eggjs/logrotator] rename ${file.srcPath}, found exception: ` +
|
|
53
|
+
err.message;
|
|
46
54
|
this.logger.error(err);
|
|
47
55
|
}
|
|
48
56
|
}
|
|
49
57
|
|
|
50
|
-
if (rotatedFiles.length) {
|
|
58
|
+
if (rotatedFiles.length > 0) {
|
|
51
59
|
// tell every one to reload logger
|
|
52
60
|
this.logger.info('[@eggjs/logrotator] broadcast log-reload');
|
|
53
61
|
this.app.messenger.sendToApp('log-reload');
|
|
54
62
|
this.app.messenger.sendToAgent('log-reload');
|
|
55
63
|
}
|
|
56
64
|
|
|
57
|
-
this.logger.info(
|
|
58
|
-
|
|
65
|
+
this.logger.info(
|
|
66
|
+
'[@eggjs/logrotator] rotate files success by %s, files %j',
|
|
67
|
+
this.constructor.name,
|
|
68
|
+
rotatedFiles
|
|
69
|
+
);
|
|
59
70
|
}
|
|
60
71
|
}
|
|
61
72
|
|
|
62
73
|
// rename from srcPath to targetPath, for example foo.log.1 > foo.log.2
|
|
63
74
|
// 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
|
|
64
|
-
async function renameOrDelete(
|
|
75
|
+
async function renameOrDelete(
|
|
76
|
+
srcPath: string,
|
|
77
|
+
targetPath: string,
|
|
78
|
+
gzip: boolean
|
|
79
|
+
) {
|
|
65
80
|
if (srcPath === targetPath) {
|
|
66
81
|
return;
|
|
67
82
|
}
|
|
@@ -80,7 +95,11 @@ async function renameOrDelete(srcPath: string, targetPath: string, gzip: boolean
|
|
|
80
95
|
if (gzip === true) {
|
|
81
96
|
const tmpPath = `${targetPath}.tmp`;
|
|
82
97
|
await fs.rename(srcPath, tmpPath);
|
|
83
|
-
await pipeline(
|
|
98
|
+
await pipeline(
|
|
99
|
+
createReadStream(tmpPath),
|
|
100
|
+
createGzip(),
|
|
101
|
+
createWriteStream(targetPath)
|
|
102
|
+
);
|
|
84
103
|
await fs.unlink(tmpPath);
|
|
85
104
|
} else {
|
|
86
105
|
await fs.rename(srcPath, targetPath);
|
package/src/lib/size_rotator.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { debuglog } from 'node:util';
|
|
4
|
+
|
|
4
5
|
import { exists } from 'utility';
|
|
5
|
-
|
|
6
|
+
|
|
7
|
+
import { LogRotator, type RotateFile } from './rotator.js';
|
|
6
8
|
|
|
7
9
|
const debug = debuglog('@eggjs/logrotator/lib/size_rotator');
|
|
8
10
|
|
|
@@ -13,7 +15,8 @@ export class SizeRotator extends LogRotator {
|
|
|
13
15
|
async getRotateFiles() {
|
|
14
16
|
const files = new Map<string, RotateFile>();
|
|
15
17
|
const logDir = this.app.config.logger.dir;
|
|
16
|
-
const filesRotateBySize =
|
|
18
|
+
const filesRotateBySize =
|
|
19
|
+
this.app.config.logrotator.filesRotateBySize || [];
|
|
17
20
|
const maxFileSize = this.app.config.logrotator.maxFileSize;
|
|
18
21
|
const maxFiles = this.app.config.logrotator.maxFiles;
|
|
19
22
|
for (let logPath of filesRotateBySize) {
|
|
@@ -28,17 +31,22 @@ export class SizeRotator extends LogRotator {
|
|
|
28
31
|
const size = stat.size;
|
|
29
32
|
try {
|
|
30
33
|
if (size >= maxFileSize) {
|
|
31
|
-
this.logger.info(
|
|
34
|
+
this.logger.info(
|
|
35
|
+
`[@eggjs/logrotator] file ${logPath} reach the maximum file size, current size: ${size}, max size: ${maxFileSize}`
|
|
36
|
+
);
|
|
32
37
|
// delete max log file if exists, otherwise will throw when rename
|
|
33
38
|
const maxFileName = `${logPath}.${maxFiles}`;
|
|
34
39
|
const stat = await exists(maxFileName);
|
|
35
40
|
if (stat) {
|
|
36
41
|
await fs.unlink(maxFileName);
|
|
37
|
-
this.logger.info(
|
|
42
|
+
this.logger.info(
|
|
43
|
+
`[@eggjs/logrotator] delete max log file ${maxFileName}`
|
|
44
|
+
);
|
|
38
45
|
}
|
|
39
46
|
this._setFile(logPath, files);
|
|
40
47
|
}
|
|
41
|
-
} catch (
|
|
48
|
+
} catch (e) {
|
|
49
|
+
const err = e as Error;
|
|
42
50
|
err.message = '[@eggjs/logrotator] ' + err.message;
|
|
43
51
|
this.logger.error(err);
|
|
44
52
|
}
|
package/src/lib/utils.ts
CHANGED
|
@@ -6,15 +6,12 @@ interface LoggerTransport {
|
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Walk all logger files from loggers
|
|
9
|
-
* @param loggers - The loggers to walk
|
|
10
9
|
*/
|
|
11
|
-
export function walkLoggerFile(
|
|
10
|
+
export function walkLoggerFile(
|
|
11
|
+
loggers: Record<string, Map<string, LoggerTransport>>
|
|
12
|
+
) {
|
|
12
13
|
const files: string[] = [];
|
|
13
|
-
for (const
|
|
14
|
-
if (!loggers.hasOwnProperty(key)) {
|
|
15
|
-
continue;
|
|
16
|
-
}
|
|
17
|
-
const registeredLogger = loggers[key];
|
|
14
|
+
for (const registeredLogger of Object.values(loggers)) {
|
|
18
15
|
for (const transport of registeredLogger.values()) {
|
|
19
16
|
const file = transport.options.file;
|
|
20
17
|
if (file) {
|