mirror of
https://github.com/nttgin/BGPalerter.git
synced 2024-05-19 06:50:08 +00:00
fixed file rotation issue where empty files were generated
This commit is contained in:
12
package-lock.json
generated
12
package-lock.json
generated
@@ -4785,10 +4785,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"moment": {
|
"moment": {
|
||||||
"version": "2.26.0",
|
"version": "2.29.0",
|
||||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz",
|
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.0.tgz",
|
||||||
"integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==",
|
"integrity": "sha512-z6IJ5HXYiuxvFTI6eiQ9dm77uE0gyy1yXNApVHqTcnIKfY9tIwEjlzsZ6u1LQXvVgKeTnv9Xm7NDvJ7lso3MtA=="
|
||||||
"optional": true
|
|
||||||
},
|
},
|
||||||
"ms": {
|
"ms": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.2",
|
||||||
@@ -5999,6 +5998,11 @@
|
|||||||
"glob": "^6.0.1"
|
"glob": "^6.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"rotating-file-stream": {
|
||||||
|
"version": "2.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/rotating-file-stream/-/rotating-file-stream-2.1.3.tgz",
|
||||||
|
"integrity": "sha512-zZ4Tkngxispo7DgiTqX0s4ChLtM3qET6iYsDA9tmgDEqJ3BFgRq/ZotsKEDAYQt9pAn9JwwqT27CSwQt3CTxNg=="
|
||||||
|
},
|
||||||
"rpki-validator": {
|
"rpki-validator": {
|
||||||
"version": "2.2.2",
|
"version": "2.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/rpki-validator/-/rpki-validator-2.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/rpki-validator/-/rpki-validator-2.2.2.tgz",
|
||||||
|
@@ -50,9 +50,11 @@
|
|||||||
"ip-sub": "^1.0.11",
|
"ip-sub": "^1.0.11",
|
||||||
"js-yaml": "^3.14.0",
|
"js-yaml": "^3.14.0",
|
||||||
"kafka-node": "^5.0.0",
|
"kafka-node": "^5.0.0",
|
||||||
|
"moment": "^2.29.0",
|
||||||
"nodemailer": "^6.4.11",
|
"nodemailer": "^6.4.11",
|
||||||
"path": "^0.12.7",
|
"path": "^0.12.7",
|
||||||
"restify": "^8.5.1",
|
"restify": "^8.5.1",
|
||||||
|
"rotating-file-stream": "^2.1.3",
|
||||||
"rpki-validator": "^2.2.2",
|
"rpki-validator": "^2.2.2",
|
||||||
"semver": "^7.3.2",
|
"semver": "^7.3.2",
|
||||||
"syslog-client": "^1.1.1",
|
"syslog-client": "^1.1.1",
|
||||||
|
@@ -271,7 +271,7 @@ config.reports = (config.reports || [])
|
|||||||
});
|
});
|
||||||
config.connectors = config.connectors || [];
|
config.connectors = config.connectors || [];
|
||||||
|
|
||||||
config.connectors.push( {
|
config.connectors.push({
|
||||||
file: "connectorSwUpdates",
|
file: "connectorSwUpdates",
|
||||||
name: "upd"
|
name: "upd"
|
||||||
});
|
});
|
||||||
|
@@ -1,11 +1,10 @@
|
|||||||
const fs = require('fs');
|
import fs from "fs";
|
||||||
const moment = require('moment');
|
import moment from "moment";
|
||||||
const zlib = require('zlib');
|
import { createStream } from "rotating-file-stream";
|
||||||
|
|
||||||
export default class FileLogger {
|
export default class FileLogger {
|
||||||
|
|
||||||
constructor(params) {
|
constructor(params) {
|
||||||
|
|
||||||
this.format = params.format || this.defaultFormat;
|
this.format = params.format || this.defaultFormat;
|
||||||
this.logRotatePattern = params.logRotatePattern || "YYYY-MM-DD";
|
this.logRotatePattern = params.logRotatePattern || "YYYY-MM-DD";
|
||||||
this.filename = params.filename;
|
this.filename = params.filename;
|
||||||
@@ -17,87 +16,32 @@ export default class FileLogger {
|
|||||||
this.maxFileSizeMB = parseFloat(params.maxFileSizeMB || 20);
|
this.maxFileSizeMB = parseFloat(params.maxFileSizeMB || 20);
|
||||||
this.maxRetainedFiles = parseFloat(params.maxRetainedFiles || 20);
|
this.maxRetainedFiles = parseFloat(params.maxRetainedFiles || 20);
|
||||||
|
|
||||||
this.backlog = [];
|
|
||||||
this.staleTimer = null;
|
|
||||||
this.backlogSize = parseFloat(params.backlogSize || 100);
|
this.backlogSize = parseFloat(params.backlogSize || 100);
|
||||||
|
|
||||||
this.wstream = null;
|
|
||||||
|
|
||||||
|
|
||||||
if (!fs.existsSync(this.directory)){
|
if (!fs.existsSync(this.directory)){
|
||||||
fs.mkdirSync(this.directory);
|
fs.mkdirSync(this.directory);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._currentFile = this.getCurrentFile();
|
const streamOptions = {
|
||||||
};
|
size: `${this.maxFileSizeMB}M`,
|
||||||
|
interval: "1d"
|
||||||
getRotatedFileName = (number) => {
|
};
|
||||||
return this._currentFile + '.' + number + ((this.compressOnRotation) ? '.gz' : '');
|
|
||||||
};
|
|
||||||
|
|
||||||
rotateOldFiles = () => {
|
|
||||||
for (let n=this.maxRetainedFiles; n >= 0; n--) {
|
|
||||||
const fileName = this.getRotatedFileName(n);
|
|
||||||
|
|
||||||
if (fs.existsSync(fileName)) {
|
|
||||||
fs.renameSync(fileName, this.getRotatedFileName(n + 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
applyFileNumberLimit = () => {
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
let files = fs.readdirSync(this.directory)
|
|
||||||
.filter(i => i.indexOf('.log') > 0)
|
|
||||||
.sort((file1, file2) => {
|
|
||||||
const v1 = file1.replace('.gz', '').split('.').pop();
|
|
||||||
const v2 = file2.replace('.gz', '').split('.').pop();
|
|
||||||
return parseInt(v1) - parseInt(v2);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (files.length >= this.maxRetainedFiles - 1) {
|
|
||||||
files = files.slice(this.maxRetainedFiles);
|
|
||||||
files
|
|
||||||
.forEach(file => {
|
|
||||||
fs.unlinkSync(this.directory + '/' + file);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
// Nothing
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
hasToBeRotated = () => {
|
|
||||||
const stat = fs.statSync(this._currentFile);
|
|
||||||
const fileSizeInMegabytes = stat.size / 1000000.0;
|
|
||||||
return fileSizeInMegabytes > this.maxFileSizeMB;
|
|
||||||
};
|
|
||||||
|
|
||||||
rotate = () => {
|
|
||||||
this.close();
|
|
||||||
const currentRotatedFile = this.getRotatedFileName(0);
|
|
||||||
const firstRotatedFile = this.getRotatedFileName(1);
|
|
||||||
fs.renameSync(this._currentFile, currentRotatedFile);
|
|
||||||
|
|
||||||
this.rotateOldFiles();
|
|
||||||
if (this.compressOnRotation) {
|
if (this.compressOnRotation) {
|
||||||
fs.writeFileSync(firstRotatedFile, zlib.gzipSync(fs.readFileSync(firstRotatedFile, 'utf8')));
|
streamOptions.compress = "gzip";
|
||||||
|
}
|
||||||
|
this.stream = createStream(this.getCurrentFile, streamOptions);
|
||||||
|
};
|
||||||
|
|
||||||
|
getCurrentFile = (time, index) => {
|
||||||
|
let suffix = "";
|
||||||
|
if (index >= 1) {
|
||||||
|
suffix = `.${index}`;
|
||||||
|
if (this.compressOnRotation) {
|
||||||
|
suffix += ".gz";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.applyFileNumberLimit();
|
return `${this.directory}/${this.filename.replace("%DATE%", moment().format(this.logRotatePattern))}${suffix}`;
|
||||||
this.open();
|
|
||||||
};
|
|
||||||
|
|
||||||
getCurrentFile = () => {
|
|
||||||
return this.directory + '/' + this.filename.replace("%DATE%", moment().format(this.logRotatePattern));
|
|
||||||
};
|
|
||||||
|
|
||||||
currentFileChanged = () => {
|
|
||||||
const file = this.getCurrentFile();
|
|
||||||
return this._currentFile && this._currentFile !== file;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
defaultFormat = (json) => {
|
defaultFormat = (json) => {
|
||||||
@@ -111,59 +55,6 @@ export default class FileLogger {
|
|||||||
data
|
data
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.stream.write(item + "\n");
|
||||||
if (this.staleTimer) {
|
|
||||||
clearTimeout(this.staleTimer);
|
|
||||||
delete this.staleTimer;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.currentFileChanged()) {
|
|
||||||
this.flush();
|
|
||||||
this.rotate();
|
|
||||||
|
|
||||||
this.backlog.push(item);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
this.backlog.push(item);
|
|
||||||
|
|
||||||
if (this.backlog.length >= this.backlogSize) {
|
|
||||||
this.flush();
|
|
||||||
if (this.hasToBeRotated()){
|
|
||||||
this.rotate();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.staleTimer = setTimeout(this.flushAndClose, 1000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
flushAndClose = () => {
|
|
||||||
this.flush();
|
|
||||||
this.close();
|
|
||||||
};
|
|
||||||
|
|
||||||
flush = () => {
|
|
||||||
const string = this.backlog.join('\n') + '\n';
|
|
||||||
this.backlog = [];
|
|
||||||
if (this.wstream === null) {
|
|
||||||
this.open();
|
|
||||||
}
|
|
||||||
fs.appendFileSync(this.wstream, string, 'utf8');
|
|
||||||
};
|
|
||||||
|
|
||||||
open = () => {
|
|
||||||
this._currentFile = this.getCurrentFile();
|
|
||||||
this.wstream = fs.openSync(this._currentFile, 'a');
|
|
||||||
};
|
|
||||||
|
|
||||||
close = () => {
|
|
||||||
if (this.wstream !== null)
|
|
||||||
fs.closeSync(this.wstream);
|
|
||||||
this.wstream = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
};
|
Reference in New Issue
Block a user