diff --git a/lib/util/logger.js b/lib/util/logger.js index 4f36a055..33e999be 100644 --- a/lib/util/logger.js +++ b/lib/util/logger.js @@ -44,7 +44,8 @@ const transportsToUse = [ format: winston.format.combine( winston.format.timestamp({format: timestampFormat}), winston.format.printf(/* istanbul ignore next */(info) => { - const {timestamp, level, message} = info; + let {timestamp, level, message} = info; + level = level === 'warning' ? 'warn' : level; const prefix = colorizer.colorize(level, `zigbee2mqtt:${levelWithCompensatedLength[level]}`); return `${prefix} ${timestamp.split('.')[0]}: ${message}`; }), @@ -61,7 +62,8 @@ const transportFileOptions = { format: winston.format.combine( winston.format.timestamp({format: timestampFormat}), winston.format.printf(/* istanbul ignore next */(info) => { - const {timestamp, level, message} = info; + let {timestamp, level, message} = info; + level = level === 'warning' ? 'warn' : level; return `${levelWithCompensatedLength[level]} ${timestamp.split('.')[0]}: ${message}`; }), ), @@ -77,8 +79,15 @@ if (output.includes('file')) { transportsToUse.push(new winston.transports.File(transportFileOptions)); } +/* istanbul ignore next */ +if (output.includes('syslog')) { + require('winston-syslog').Syslog; + const options = {app_name: 'zigbee2mqtt', ...settings.get().advanced.log_syslog}; + transportsToUse.push(new winston.transports.Syslog(options)); +} + // Create logger -const logger = winston.createLogger({transports: transportsToUse}); +const logger = winston.createLogger({transports: transportsToUse, levels: winston.config.syslog.levels}); // Cleanup any old log directory. function cleanup() { @@ -117,4 +126,8 @@ if (output.includes('file')) { logger.info(`Logging to console only'`); } +// winston.config.syslog.levels doesnt have warn, but is required for syslog. +/* istanbul ignore next */ +logger.warn = (message) => logger.warning(message); + module.exports = logger; diff --git a/lib/util/settings.js b/lib/util/settings.js index 269154ce..b6f1c72e 100644 --- a/lib/util/settings.js +++ b/lib/util/settings.js @@ -50,6 +50,7 @@ const defaults = { log_directory: path.join(data.getPath(), 'log', '%TIMESTAMP%'), log_file: 'log.txt', log_level: /* istanbul ignore next */ process.env.DEBUG ? 'debug' : 'info', + log_syslog: {}, soft_reset_timeout: 0, pan_id: 0x1a62, ext_pan_id: [0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD], diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 84a4be02..bceea85b 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1091,6 +1091,15 @@ "tweetnacl": "^0.14.3" } }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bl": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", @@ -2356,6 +2365,12 @@ "flat-cache": "^2.0.1" } }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -2548,6 +2563,11 @@ "type-fest": "^0.8.1" } }, + "glossy": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/glossy/-/glossy-0.1.7.tgz", + "integrity": "sha1-dptZhKlvYGarnqdYIkgl7mwhDws=" + }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", @@ -3966,6 +3986,12 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "optional": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -5682,6 +5708,16 @@ "through2-filter": "^3.0.0" } }, + "unix-dgram": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unix-dgram/-/unix-dgram-2.0.3.tgz", + "integrity": "sha512-Bay5CkSLcdypcBCsxvHEvaG3mftzT5FlUnRToPWEAVxwYI8NI/8zSJ/Gknlp86MPhV6hBA8I8TBsETj2tssoHQ==", + "optional": true, + "requires": { + "bindings": "^1.3.0", + "nan": "^2.13.2" + } + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -5923,6 +5959,15 @@ } } }, + "winston-syslog": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/winston-syslog/-/winston-syslog-2.4.4.tgz", + "integrity": "sha512-zDjoKO932Yszvzq8WtbIFMXHwAT2MOxpWC9s6djw2tvjdRESWw3au6l+0xDMatMhNWVoVaVNkDXF+r/eyoBUVA==", + "requires": { + "glossy": "^0.1.7", + "unix-dgram": "2.0.3" + } + }, "winston-transport": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", diff --git a/package.json b/package.json index ca0825a5..0cf8e6b7 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "rimraf": "*", "semver": "*", "winston": "*", + "winston-syslog": "*", "zigbee-herdsman": "0.12.91", "zigbee-herdsman-converters": "12.0.104" },