diff --git a/.gitignore b/.gitignore index 5b3eb58d..8311d4f7 100644 --- a/.gitignore +++ b/.gitignore @@ -61,4 +61,5 @@ typings/ data/database.db data/config.json data/log*.txt -data/state.json \ No newline at end of file +data/state.json +data/log \ No newline at end of file diff --git a/lib/util/logger.js b/lib/util/logger.js index db180d6e..926f023e 100644 --- a/lib/util/logger.js +++ b/lib/util/logger.js @@ -4,36 +4,38 @@ const data = require('./data'); const settings = require('./settings'); const path = require('path'); const fs = require('fs'); +const fx = require('mkdir-recursive'); +const rimraf = require('rimraf'); -let logLevel = ''; +// Determine the log level. +let level = winston.level.info; if (process.env.DEBUG) { - logLevel = 'debug'; + level = 'debug'; } else if (settings.get().advanced && settings.get().advanced.log_level) { - logLevel = settings.get().advanced.log_level; -} else { - logLevel = winston.level.info; + level = settings.get().advanced.log_level; } -const logDirectory = settings.get().advanced && settings.get().advanced.log_directory ? - settings.get().advanced.log_directory : data.getPath(); - -if (settings.get().advanced && settings.get().advanced.log_filename) { - filename = settings.get().advanced.log_filename ? settings.get().advanced.log_filename : '[log-]%filenamedateformat%'; - filenamedateformat = settings.get().advanced && settings.get().advanced.log_filename_date_format ? settings.get().advanced.log_filename_date_format : 'YYYY-MM-DD'; - completefilename = moment(new Date()).format(filename.replace('%filenamedateformat%', filenamedateformat)); -} else { - filename = 'log'; - completefilename = filename; +// Directoy to log to +let rootDirectory = path.join(data.getPath(), 'log'); +if (settings.get().advanced && settings.get().advanced.log_directory) { + rootDirectory = settings.get().advanced.log_directory; } +// Add start time to directory. +const directory = path.join(rootDirectory, moment(Date.now()).format('YYYY-MM-DD.HH:mm:ss')); + +// Make sure that log directoy exsists +fx.mkdirSync(directory); + +// Create logger const logger = new (winston.Logger)({ transports: [ new (winston.transports.File)({ - filename: path.join(logDirectory, completefilename + '.txt'), + filename: path.join(directory, 'log.txt'), json: false, - level: logLevel, - maxFiles: 3, - maxsize: 10000000, // 10MB + level: level, + maxFiles: 3, // Max 3 files per run. + maxsize: 10000000, // 10MB // Only if Filename is static! timestamp: () => new Date().toLocaleString(), }), new (winston.transports.Console)({ @@ -47,39 +49,21 @@ const logger = new (winston.Logger)({ ], }); -(function cleanup() { -var wantkeep = 5; // How many files (count) we want to keep ?? -fs.readdir(logDirectory, function(err,files){ - if (err) return logger.error(`Some Error on logger-cleanup-function-readdir: ${err}`); - var filesList = files.filter(function(e){ - return path.extname(e).toLowerCase() === '.txt' // Filter only txt files - }); - filesList.sort(function(filea, fileb){ - return fs.statSync(logDirectory + '/' + fileb).mtime.getTime() - fs.statSync(logDirectory + '/' + filea).mtime.getTime(); // Filter newest on top - }); - wantkeep = wantkeep + 1; //Lets be safe and add one more on top. - if (filesList.length > wantkeep) { - filesList = filesList.slice(wantkeep); // How many files (count) we want to keep ?? - for (var i = 0; i < filesList.length; i++) { - logger.info(`actually count to delete: ${filesList.length}`); //counter of files who real would be delete (count-readdir - wantkeep) - logger.warn(`Want to CleanUp File: ${filesList[i]}`); - const unlinkname = filesList[i]; //lets save the filename because after delete ... - fs.unlink(path.join(logDirectory, filesList[i]), function(err){ - if (err) { - logger.error(`Failed to delete: ${unlinkname} - ${err}`); - } else { - logger.info(`Successfully deleted ${unlinkname}`); - } - }); - } - } else { - logger.warn(`No need to work on file cleanup because we need more than ${wantkeep} Files (wantkeep-value) to proceed - actually count: ${filesList.length}`); - } +logger.info(`Logging to directory: '${directory}'`); + +logger.transports.console.level = level; + +// Cleanup any old log directory. +let directories = fs.readdirSync(rootDirectory).map((d) => { + d = path.join(rootDirectory, d); + return {path: d, birth: fs.statSync(d).birthtimeMs}; }); -})(); -logger.info(`Logging to directory: '${logDirectory}' with filename: '${completefilename}.txt'`); - -logger.transports.console.level = logLevel; +directories.sort((a, b) => b.birth - a.birth); +directories = directories.slice(10, directories.length); +directories.forEach((dir) => { + logger.debug(`Removing old log directory '${dir.path}'`); + rimraf.sync(dir.path); +}); module.exports = logger; diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index f33969e9..e02bd5df 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -2114,6 +2114,11 @@ } } }, + "mkdir-recursive": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/mkdir-recursive/-/mkdir-recursive-0.4.0.tgz", + "integrity": "sha512-gbTtiEu8P/GSMh1lAa0YYNr8XIfDzFgnWtetw3Hfz9nw6YXySHNYOZF/uUTgyp8GHvFnNw/EG7VhOkD6zfVb6A==" + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -2180,6 +2185,11 @@ "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", "dev": true }, + "moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + }, "mqtt": { "version": "2.18.3", "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-2.18.3.tgz", @@ -4977,7 +4987,6 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, "requires": { "glob": "^7.0.5" } diff --git a/package.json b/package.json index ef043193..f27452a8 100644 --- a/package.json +++ b/package.json @@ -34,9 +34,11 @@ "git-last-commit": "*", "js-yaml": "*", "json2yaml": "*", + "mkdir-recursive": "*", "moment": "*", "mqtt": "*", "object-assign-deep": "*", + "rimraf": "*", "winston": "2.4.2", "zcl-packet": "git+https://github.com/Koenkk/zcl-packet.git#b7d5b4478a88cd3fc65328c6dc94572c277c7d3e", "zigbee-shepherd": "git+https://github.com/Koenkk/zigbee-shepherd.git#7673fc5a285dc93d2e466bc2aa7134220e1fb134",