From c2cd02e79060aaaee1d6f2eab930268e9fd6ed03 Mon Sep 17 00:00:00 2001 From: tb-killa Date: Wed, 8 Aug 2018 08:24:47 +0200 Subject: [PATCH 1/5] add moment to package.json --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index da3dbe1aa..ef043193e 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "git-last-commit": "*", "js-yaml": "*", "json2yaml": "*", + "moment": "*", "mqtt": "*", "object-assign-deep": "*", "winston": "2.4.2", From 427c99cd83b5998bc0eef9442ccfa7e06aca17bc Mon Sep 17 00:00:00 2001 From: tb-killa Date: Wed, 8 Aug 2018 08:33:53 +0200 Subject: [PATCH 2/5] add moment to logger.js --- lib/util/logger.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/util/logger.js b/lib/util/logger.js index 7d87af670..fa077c2c2 100644 --- a/lib/util/logger.js +++ b/lib/util/logger.js @@ -1,4 +1,5 @@ const winston = require('winston'); +const moment = require('moment'); const data = require('./data'); const settings = require('./settings'); const path = require('path'); From 931926cd96d7c53e519d82d0f4892e960c7b6bf3 Mon Sep 17 00:00:00 2001 From: tb-killa Date: Sun, 12 Aug 2018 20:39:06 +0200 Subject: [PATCH 3/5] add fs and bring in advanced logname with dateformat --- lib/util/logger.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/util/logger.js b/lib/util/logger.js index fa077c2c2..8324ce85a 100644 --- a/lib/util/logger.js +++ b/lib/util/logger.js @@ -3,6 +3,7 @@ const moment = require('moment'); const data = require('./data'); const settings = require('./settings'); const path = require('path'); +const fs = require('fs'); let logLevel = ''; if (process.env.DEBUG) { @@ -14,12 +15,21 @@ if (process.env.DEBUG) { } const logDirectory = settings.get().advanced && settings.get().advanced.log_directory ? - settings.get().advanced.log_directory : data.getPath(); + 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; +} const logger = new (winston.Logger)({ transports: [ new (winston.transports.File)({ - filename: path.join(logDirectory, 'log.txt'), + filename: path.join(logDirectory, completefilename + '.txt'), json: false, level: logLevel, maxFiles: 3, @@ -37,7 +47,7 @@ const logger = new (winston.Logger)({ ], }); -logger.info(`Logging to directory: '${logDirectory}'`); +logger.info(`Logging to directory: '${logDirectory}' with filename: '${completefilename}.txt'`); logger.transports.console.level = logLevel; From c520985a4fd09c17fb21df7902ed4dbc48699a58 Mon Sep 17 00:00:00 2001 From: tb-killa Date: Sun, 12 Aug 2018 20:42:06 +0200 Subject: [PATCH 4/5] Implement cleanup-function for logfiles --- lib/util/logger.js | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/lib/util/logger.js b/lib/util/logger.js index 8324ce85a..db180d6e7 100644 --- a/lib/util/logger.js +++ b/lib/util/logger.js @@ -47,6 +47,37 @@ 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: '${logDirectory}' with filename: '${completefilename}.txt'`); logger.transports.console.level = logLevel; From 197a3cdebcdfbbeec0fca154584983c99b1b42ef Mon Sep 17 00:00:00 2001 From: Koenkk Date: Thu, 16 Aug 2018 20:04:29 +0200 Subject: [PATCH 5/5] Update log file extension. --- .gitignore | 3 +- lib/util/logger.js | 86 ++++++++++++++++++--------------------------- npm-shrinkwrap.json | 11 +++++- package.json | 2 ++ 4 files changed, 49 insertions(+), 53 deletions(-) diff --git a/.gitignore b/.gitignore index 5b3eb58d8..8311d4f7e 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 db180d6e7..926f023e5 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 f33969e97..e02bd5df1 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 ef043193e..f27452a83 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",