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 7d87af670..926f023e5 100644 --- a/lib/util/logger.js +++ b/lib/util/logger.js @@ -1,28 +1,41 @@ const winston = require('winston'); +const moment = require('moment'); 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(); +// 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, 'log.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)({ @@ -36,8 +49,21 @@ const logger = new (winston.Logger)({ ], }); -logger.info(`Logging to directory: '${logDirectory}'`); +logger.info(`Logging to directory: '${directory}'`); -logger.transports.console.level = logLevel; +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}; +}); + +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 da3dbe1aa..f27452a83 100644 --- a/package.json +++ b/package.json @@ -34,8 +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",