@eggjs/logrotator 5.0.0-beta.35 → 5.0.0-beta.36
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/dist/agent.d.ts +2 -2
- package/dist/agent.js +6 -2
- package/dist/app/extend/agent.d.ts +6 -3
- package/dist/app/extend/agent.js +7 -6
- package/dist/app/extend/application.d.ts +6 -3
- package/dist/app/extend/application.js +7 -5
- package/dist/app/schedule/clean_log.d.ts +6 -3
- package/dist/app/schedule/clean_log.js +56 -66
- package/dist/app/schedule/rotate_by_file.d.ts +6 -3
- package/dist/app/schedule/rotate_by_file.js +17 -13
- package/dist/app/schedule/rotate_by_hour.d.ts +6 -3
- package/dist/app/schedule/rotate_by_hour.js +17 -13
- package/dist/app/schedule/rotate_by_size.d.ts +6 -3
- package/dist/app/schedule/rotate_by_size.js +17 -13
- package/dist/app.d.ts +2 -2
- package/dist/app.js +6 -2
- package/dist/boot.d.ts +9 -5
- package/dist/boot.js +16 -14
- package/dist/config/config.default.d.ts +59 -57
- package/dist/config/config.default.js +15 -14
- package/dist/index.d.ts +21 -17
- package/dist/index.js +25 -22
- package/dist/lib/day_rotator.d.ts +11 -7
- package/dist/lib/day_rotator.js +62 -78
- package/dist/lib/hour_rotator.d.ts +9 -5
- package/dist/lib/hour_rotator.js +37 -38
- package/dist/lib/rotator.d.ts +17 -13
- package/dist/lib/rotator.js +54 -71
- package/dist/lib/size_rotator.d.ts +8 -4
- package/dist/lib/size_rotator.js +60 -66
- package/dist/lib/utils.d.ts +9 -7
- package/dist/lib/utils.js +13 -14
- package/dist/types.d.ts +19 -17
- package/dist/types.js +1 -2
- package/package.json +25 -31
package/dist/index.js
CHANGED
|
@@ -1,24 +1,27 @@
|
|
|
1
|
-
import "./
|
|
2
|
-
import { definePluginFactory } from
|
|
1
|
+
import { LogRotator } from "./lib/rotator.js";
|
|
2
|
+
import { definePluginFactory } from "egg";
|
|
3
|
+
|
|
4
|
+
//#region src/index.ts
|
|
3
5
|
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
6
|
+
* LogRotator plugin
|
|
7
|
+
*
|
|
8
|
+
* @since 4.1.0
|
|
9
|
+
* Usage:
|
|
10
|
+
* ```ts
|
|
11
|
+
* // config/plugin.ts
|
|
12
|
+
* import logrotatorPlugin from '@eggjs/logrotator';
|
|
13
|
+
*
|
|
14
|
+
* export default {
|
|
15
|
+
* ...logrotatorPlugin(),
|
|
16
|
+
* };
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
var src_default = definePluginFactory({
|
|
20
|
+
name: "logrotator",
|
|
21
|
+
enable: true,
|
|
22
|
+
path: import.meta.dirname,
|
|
23
|
+
dependencies: ["schedule"]
|
|
22
24
|
});
|
|
23
|
-
|
|
24
|
-
//#
|
|
25
|
+
|
|
26
|
+
//#endregion
|
|
27
|
+
export { LogRotator, src_default as default };
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import { LogRotator,
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { LogRotator, RotateFile, RotatorOptions } from "./rotator.js";
|
|
2
|
+
|
|
3
|
+
//#region src/lib/day_rotator.d.ts
|
|
4
|
+
declare class DayRotator extends LogRotator {
|
|
5
|
+
private filesRotateBySize;
|
|
6
|
+
private filesRotateByHour;
|
|
7
|
+
constructor(options: RotatorOptions);
|
|
8
|
+
getRotateFiles(): Promise<Map<string, RotateFile>>;
|
|
9
|
+
_setFile(srcPath: string, files: Map<string, RotateFile>): void;
|
|
8
10
|
}
|
|
11
|
+
//#endregion
|
|
12
|
+
export { DayRotator };
|
package/dist/lib/day_rotator.js
CHANGED
|
@@ -1,80 +1,64 @@
|
|
|
1
|
-
import fs from 'node:fs/promises';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { debuglog } from 'node:util';
|
|
4
|
-
import moment from 'moment';
|
|
5
|
-
import { exists } from 'utility';
|
|
6
1
|
import { LogRotator } from "./rotator.js";
|
|
7
2
|
import { walkLoggerFile } from "./utils.js";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
if (!files.has(srcPath)) {
|
|
72
|
-
const ext = this.app.config.logrotator.gzip === true ? '.gz' : '';
|
|
73
|
-
// allow 2 minutes deviation
|
|
74
|
-
const targetPath = srcPath + moment().subtract(23, 'hours').subtract(58, 'minutes').format('.YYYY-MM-DD') + ext;
|
|
75
|
-
debug('set file %s => %s', srcPath, targetPath);
|
|
76
|
-
files.set(srcPath, { srcPath, targetPath });
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF5X3JvdGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2RheV9yb3RhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXJDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWpDLE9BQU8sRUFBRSxVQUFVLEVBQXdDLE1BQU0sY0FBYyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFNUMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7QUFFekQsb0JBQW9CO0FBQ3BCLDRDQUE0QztBQUM1QyxNQUFNLE9BQU8sVUFBVyxTQUFRLFVBQVU7SUFDaEMsaUJBQWlCLENBQVc7SUFDNUIsaUJBQWlCLENBQVc7SUFFcEMsWUFBWSxPQUF1QjtRQUNqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztRQUM1RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztJQUM5RSxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWM7UUFDbEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUMxQyxNQUFN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
|
|
3
|
+
import fs from "node:fs/promises";
|
|
4
|
+
import { debuglog } from "node:util";
|
|
5
|
+
import { exists } from "utility";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import moment from "moment";
|
|
8
|
+
|
|
9
|
+
//#region src/lib/day_rotator.ts
|
|
10
|
+
const debug = debuglog("egg/logrotator/lib/day_rotator");
|
|
11
|
+
var DayRotator = class 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 = /* @__PURE__ */ 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
|
+
if (!path.isAbsolute(file)) file = path.join(logDir, file);
|
|
26
|
+
this._setFile(file, files);
|
|
27
|
+
}
|
|
28
|
+
const agentLogName = this.app.config.logger.agentLogName;
|
|
29
|
+
this._setFile(path.join(logDir, agentLogName), files);
|
|
30
|
+
const rotateLogDirs = this.app.config.logger.rotateLogDirs;
|
|
31
|
+
if (rotateLogDirs && rotateLogDirs.length > 0) {
|
|
32
|
+
this.app.deprecate("[@eggjs/logrotator] Do not use app.config.logger.rotateLogDirs, only rotate core loggers and custom loggers");
|
|
33
|
+
for (const dir of rotateLogDirs) {
|
|
34
|
+
if (!await exists(dir)) continue;
|
|
35
|
+
try {
|
|
36
|
+
const names = await fs.readdir(dir);
|
|
37
|
+
for (const name of names) {
|
|
38
|
+
if (!name.endsWith(".log")) continue;
|
|
39
|
+
this._setFile(path.join(dir, name), files);
|
|
40
|
+
}
|
|
41
|
+
} catch (err) {
|
|
42
|
+
this.logger.error(err);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return files;
|
|
47
|
+
}
|
|
48
|
+
_setFile(srcPath, files) {
|
|
49
|
+
if (this.filesRotateBySize.includes(srcPath)) return;
|
|
50
|
+
if (this.filesRotateByHour.includes(srcPath)) return;
|
|
51
|
+
if (!files.has(srcPath)) {
|
|
52
|
+
const ext = this.app.config.logrotator.gzip === true ? ".gz" : "";
|
|
53
|
+
const targetPath = srcPath + moment().subtract(23, "hours").subtract(58, "minutes").format(".YYYY-MM-DD") + ext;
|
|
54
|
+
debug("set file %s => %s", srcPath, targetPath);
|
|
55
|
+
files.set(srcPath, {
|
|
56
|
+
srcPath,
|
|
57
|
+
targetPath
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
//#endregion
|
|
64
|
+
export { DayRotator };
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
import { LogRotator,
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { LogRotator, RotateFile } from "./rotator.js";
|
|
2
|
+
|
|
3
|
+
//#region src/lib/hour_rotator.d.ts
|
|
4
|
+
declare class HourRotator extends LogRotator {
|
|
5
|
+
getRotateFiles(): Promise<Map<string, RotateFile>>;
|
|
6
|
+
get hourDelimiter(): string;
|
|
7
|
+
_setFile(srcPath: string, files: Map<string, RotateFile>): void;
|
|
6
8
|
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { HourRotator };
|
package/dist/lib/hour_rotator.js
CHANGED
|
@@ -1,39 +1,38 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import { debuglog } from 'node:util';
|
|
3
|
-
import moment from 'moment';
|
|
4
|
-
import { exists } from 'utility';
|
|
5
1
|
import { LogRotator } from "./rotator.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
|
|
2
|
+
import { debuglog } from "node:util";
|
|
3
|
+
import { exists } from "utility";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import moment from "moment";
|
|
6
|
+
|
|
7
|
+
//#region src/lib/hour_rotator.ts
|
|
8
|
+
const debug = debuglog("egg/logrotator/lib/hour_rotator");
|
|
9
|
+
var HourRotator = class extends LogRotator {
|
|
10
|
+
async getRotateFiles() {
|
|
11
|
+
const files = /* @__PURE__ */ 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
|
+
if (!path.isAbsolute(logPath)) logPath = path.join(logDir, logPath);
|
|
16
|
+
if (!await exists(logPath)) continue;
|
|
17
|
+
this._setFile(logPath, files);
|
|
18
|
+
}
|
|
19
|
+
return files;
|
|
20
|
+
}
|
|
21
|
+
get hourDelimiter() {
|
|
22
|
+
return this.app.config.logrotator.hourDelimiter;
|
|
23
|
+
}
|
|
24
|
+
_setFile(srcPath, files) {
|
|
25
|
+
if (!files.has(srcPath)) {
|
|
26
|
+
const ext = this.app.config.logrotator.gzip === true ? ".gz" : "";
|
|
27
|
+
const targetPath = srcPath + moment().subtract(1, "hours").format(`.YYYY-MM-DD${this.hourDelimiter}HH`) + ext;
|
|
28
|
+
debug("set file %s => %s", srcPath, targetPath);
|
|
29
|
+
files.set(srcPath, {
|
|
30
|
+
srcPath,
|
|
31
|
+
targetPath
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
//#endregion
|
|
38
|
+
export { HourRotator };
|
package/dist/lib/rotator.d.ts
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { Application } from "egg";
|
|
2
|
+
|
|
3
|
+
//#region src/lib/rotator.d.ts
|
|
4
|
+
interface RotatorOptions {
|
|
5
|
+
app: Application;
|
|
4
6
|
}
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
interface RotateFile {
|
|
8
|
+
srcPath: string;
|
|
9
|
+
targetPath: string;
|
|
8
10
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
declare abstract class LogRotator {
|
|
12
|
+
protected readonly options: RotatorOptions;
|
|
13
|
+
protected readonly app: Application;
|
|
14
|
+
protected readonly logger: Application["coreLogger"];
|
|
15
|
+
constructor(options: RotatorOptions);
|
|
16
|
+
abstract getRotateFiles(): Promise<Map<string, RotateFile>>;
|
|
17
|
+
rotate(): Promise<void>;
|
|
16
18
|
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { LogRotator, RotateFile, RotatorOptions };
|
package/dist/lib/rotator.js
CHANGED
|
@@ -1,73 +1,56 @@
|
|
|
1
|
-
import assert from
|
|
2
|
-
import {
|
|
3
|
-
import fs from
|
|
4
|
-
import { pipeline } from
|
|
5
|
-
import { debuglog } from
|
|
6
|
-
import { createGzip } from
|
|
7
|
-
import { exists } from
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
// rename from srcPath to targetPath, for example foo.log.1 > foo.log.2
|
|
46
|
-
// 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
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { createReadStream, createWriteStream } from "node:fs";
|
|
3
|
+
import fs from "node:fs/promises";
|
|
4
|
+
import { pipeline } from "node:stream/promises";
|
|
5
|
+
import { debuglog } from "node:util";
|
|
6
|
+
import { createGzip } from "node:zlib";
|
|
7
|
+
import { exists } from "utility";
|
|
8
|
+
|
|
9
|
+
//#region src/lib/rotator.ts
|
|
10
|
+
const debug = debuglog("egg/logrotator/lib/rotator");
|
|
11
|
+
var LogRotator = class {
|
|
12
|
+
options;
|
|
13
|
+
app;
|
|
14
|
+
logger;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.options = options;
|
|
17
|
+
assert(this.options.app, "options.app is required");
|
|
18
|
+
this.app = this.options.app;
|
|
19
|
+
this.logger = this.app.coreLogger;
|
|
20
|
+
}
|
|
21
|
+
async rotate() {
|
|
22
|
+
const files = await this.getRotateFiles();
|
|
23
|
+
assert(files instanceof Map, "getRotateFiles should return a Map");
|
|
24
|
+
const rotatedFiles = [];
|
|
25
|
+
for (const file of files.values()) try {
|
|
26
|
+
debug("rename from %s to %s", file.srcPath, file.targetPath);
|
|
27
|
+
await renameOrDelete(file.srcPath, file.targetPath, this.app.config.logrotator.gzip);
|
|
28
|
+
rotatedFiles.push(`${file.srcPath} -> ${file.targetPath}`);
|
|
29
|
+
} catch (e) {
|
|
30
|
+
const err = e;
|
|
31
|
+
err.message = `[@eggjs/logrotator] rename ${file.srcPath}, found exception: ${err.message}`;
|
|
32
|
+
this.logger.error(err);
|
|
33
|
+
}
|
|
34
|
+
if (rotatedFiles.length > 0) {
|
|
35
|
+
debug("broadcast log-reload, rotated files: %j", rotatedFiles);
|
|
36
|
+
this.logger.info("[@eggjs/logrotator] broadcast log-reload");
|
|
37
|
+
this.app.messenger.sendToApp("log-reload");
|
|
38
|
+
this.app.messenger.sendToAgent("log-reload");
|
|
39
|
+
}
|
|
40
|
+
this.logger.info("[@eggjs/logrotator] rotate files success by %s, files %j", this.constructor.name, rotatedFiles);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
47
43
|
async function renameOrDelete(srcPath, targetPath, gzip) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
// because the target file always be renamed first.
|
|
58
|
-
if (targetExists) {
|
|
59
|
-
const err = new Error(`targetFile ${targetPath} exists!!!`);
|
|
60
|
-
throw err;
|
|
61
|
-
}
|
|
62
|
-
// if gzip is true, then use gzip
|
|
63
|
-
if (gzip === true) {
|
|
64
|
-
const tmpPath = `${targetPath}.tmp`;
|
|
65
|
-
await fs.rename(srcPath, tmpPath);
|
|
66
|
-
await pipeline(createReadStream(tmpPath), createGzip(), createWriteStream(targetPath));
|
|
67
|
-
await fs.unlink(tmpPath);
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
await fs.rename(srcPath, targetPath);
|
|
71
|
-
}
|
|
44
|
+
if (srcPath === targetPath) return;
|
|
45
|
+
if (!await exists(srcPath)) return;
|
|
46
|
+
if (await exists(targetPath)) throw /* @__PURE__ */ new Error(`targetFile ${targetPath} exists!!!`);
|
|
47
|
+
if (gzip === true) {
|
|
48
|
+
const tmpPath = `${targetPath}.tmp`;
|
|
49
|
+
await fs.rename(srcPath, tmpPath);
|
|
50
|
+
await pipeline(createReadStream(tmpPath), createGzip(), createWriteStream(targetPath));
|
|
51
|
+
await fs.unlink(tmpPath);
|
|
52
|
+
} else await fs.rename(srcPath, targetPath);
|
|
72
53
|
}
|
|
73
|
-
|
|
54
|
+
|
|
55
|
+
//#endregion
|
|
56
|
+
export { LogRotator };
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import { LogRotator,
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { LogRotator, RotateFile } from "./rotator.js";
|
|
2
|
+
|
|
3
|
+
//#region src/lib/size_rotator.d.ts
|
|
4
|
+
declare class SizeRotator extends LogRotator {
|
|
5
|
+
getRotateFiles(): Promise<Map<string, RotateFile>>;
|
|
6
|
+
_setFile(logPath: string, files: Map<string, RotateFile>): void;
|
|
5
7
|
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { SizeRotator };
|