diff --git a/.eslintrc b/.eslintrc index de7f666..2a2f864 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,7 +1,7 @@ { "extends": "airbnb-base", "rules": { - "comma-dangle": 1, + "comma-dangle": 0, "indent": 2, "object-shorthand": 0, "func-names": 0, @@ -9,7 +9,9 @@ "no-use-before-define": 1, "no-param-reassign": 0, "strict": 0, - "import/no-extraneous-dependencies": 1 + "import/no-extraneous-dependencies": 1, + "prefer-spread": 0, + "prefer-rest-params": 0 }, "parser-options": { "ecmaVersion": 6 diff --git a/.gitignore b/.gitignore index ccfb9e6..d821c0c 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ test/streams/test-* .idea .vscode .DS_Store + +yarn.lock diff --git a/lib/appenders/categoryFilter.js b/lib/appenders/categoryFilter.js index 26fc2b9..c4ab9d7 100644 --- a/lib/appenders/categoryFilter.js +++ b/lib/appenders/categoryFilter.js @@ -3,8 +3,8 @@ const log4js = require('../log4js'); function categoryFilter(excludes, appender) { - if (typeof(excludes) === 'string') excludes = [excludes]; - return logEvent => { + if (typeof excludes === 'string') excludes = [excludes]; + return (logEvent) => { if (excludes.indexOf(logEvent.categoryName) === -1) { appender(logEvent); } diff --git a/lib/appenders/clustered.js b/lib/appenders/clustered.js index 0e11d58..350209f 100755 --- a/lib/appenders/clustered.js +++ b/lib/appenders/clustered.js @@ -1,3 +1,5 @@ +/* eslint-disable no-plusplus */ + 'use strict'; const cluster = require('cluster'); @@ -70,7 +72,7 @@ function deserializeLoggingEvent(loggingEventString) { */ function createAppender(config) { if (cluster.isMaster) { - const masterAppender = loggingEvent => { + const masterAppender = (loggingEvent) => { if (config.actualAppenders) { const size = config.actualAppenders.length; for (let i = 0; i < size; i++) { @@ -87,8 +89,8 @@ function createAppender(config) { }; // Listen on new workers - cluster.on('fork', worker => { - worker.on('message', message => { + cluster.on('fork', (worker) => { + worker.on('message', (message) => { if (message.type && message.type === '::log-message') { const loggingEvent = deserializeLoggingEvent(message.event); @@ -108,7 +110,7 @@ function createAppender(config) { return masterAppender; } - return loggingEvent => { + return (loggingEvent) => { // If inside the worker process, then send the logger event to master. if (cluster.isWorker) { // console.log("worker " + cluster.worker.id + " is sending message"); diff --git a/lib/appenders/console.js b/lib/appenders/console.js index d680a76..6b2e691 100644 --- a/lib/appenders/console.js +++ b/lib/appenders/console.js @@ -1,11 +1,12 @@ 'use strict'; const layouts = require('../layouts'); + const consoleLog = console.log.bind(console); function consoleAppender(layout, timezoneOffset) { layout = layout || layouts.colouredLayout; - return loggingEvent => { + return (loggingEvent) => { consoleLog(layout(loggingEvent, timezoneOffset)); }; } diff --git a/lib/appenders/dateFile.js b/lib/appenders/dateFile.js index bfb4bbf..3b31bdc 100644 --- a/lib/appenders/dateFile.js +++ b/lib/appenders/dateFile.js @@ -4,12 +4,13 @@ const streams = require('streamroller'); const layouts = require('../layouts'); const path = require('path'); const os = require('os'); + const eol = os.EOL || '\n'; const openFiles = []; // close open files on process exit. process.on('exit', () => { - openFiles.forEach(file => { + openFiles.forEach((file) => { file.end(); }); }); @@ -37,7 +38,7 @@ function appender( ); openFiles.push(logFile); - return logEvent => { + return (logEvent) => { logFile.write(layout(logEvent, timezoneOffset) + eol, 'utf8'); }; } @@ -69,9 +70,9 @@ function configure(config, options) { function shutdown(cb) { let completed = 0; let error; - const complete = err => { + const complete = (err) => { error = error || err; - completed++; + completed++; // eslint-disable-line no-plusplus if (completed >= openFiles.length) { cb(error); } @@ -80,7 +81,7 @@ function shutdown(cb) { return cb(); } - return openFiles.forEach(file => { + return openFiles.forEach((file) => { if (!file.write(eol, 'utf-8')) { file.once('drain', () => { file.end(complete); diff --git a/lib/appenders/file.js b/lib/appenders/file.js index ce9be0e..9284e14 100644 --- a/lib/appenders/file.js +++ b/lib/appenders/file.js @@ -3,16 +3,16 @@ const debug = require('debug')('log4js:file'); const layouts = require('../layouts'); const path = require('path'); -const fs = require('fs'); const streams = require('streamroller'); const os = require('os'); + const eol = os.EOL || '\n'; const openFiles = []; // close open files on process exit. process.on('exit', () => { debug('Exit handler called.'); - openFiles.forEach(file => { + openFiles.forEach((file) => { file.end(); }); }); @@ -20,9 +20,9 @@ process.on('exit', () => { // On SIGHUP, close and reopen all files. This allows this appender to work with // logrotate. Note that if you are using logrotate, you should not set // `logSize`. -process.on('SIGHUP', function() { +process.on('SIGHUP', () => { debug('SIGHUP handler called.'); - openFiles.forEach(function(writer) { + openFiles.forEach((writer) => { writer.closeTheStream(writer.openTheStream.bind(writer)); }); }); @@ -40,40 +40,39 @@ process.on('SIGHUP', function() { * @param options - options to be passed to the underlying stream * @param timezoneOffset - optional timezone offset in minutes (default system local) */ -function fileAppender (file, layout, logSize, numBackups, options, timezoneOffset) { +function fileAppender(file, layout, logSize, numBackups, options, timezoneOffset) { file = path.normalize(file); layout = layout || layouts.basicLayout; numBackups = numBackups === undefined ? 5 : numBackups; // there has to be at least one backup if logSize has been specified numBackups = numBackups === 0 ? 1 : numBackups; - debug("Creating file appender (", - file, ", ", - logSize, ", ", - numBackups, ", ", - options, ", ", - timezoneOffset, ")" + debug('Creating file appender (', + file, ', ', + logSize, ', ', + numBackups, ', ', + options, ', ', + timezoneOffset, ')' ); - var writer = openTheStream(file, logSize, numBackups, options); + const writer = openTheStream(file, logSize, numBackups, options); // push file to the stack of open handlers openFiles.push(writer); - return function(loggingEvent) { - writer.write(layout(loggingEvent, timezoneOffset) + eol, "utf8"); + return function (loggingEvent) { + writer.write(layout(loggingEvent, timezoneOffset) + eol, 'utf8'); }; - } function openTheStream(file, fileSize, numFiles, options) { - var stream = new streams.RollingFileStream( + const stream = new streams.RollingFileStream( file, fileSize, numFiles, options ); - stream.on("error", function (err) { - console.error("log4js.fileAppender - Writing to file %s, error happened ", file, err); + stream.on('error', (err) => { + console.error('log4js.fileAppender - Writing to file %s, error happened ', file, err); }); return stream; } @@ -102,9 +101,9 @@ function configure(config, options) { function shutdown(cb) { let completed = 0; let error; - const complete = err => { + const complete = (err) => { error = error || err; - completed++; + completed++; // eslint-disable-line no-plusplus if (completed >= openFiles.length) { cb(error); } @@ -113,7 +112,7 @@ function shutdown(cb) { return cb(); } - return openFiles.forEach(file => { + return openFiles.forEach((file) => { if (!file.write(eol, 'utf-8')) { file.once('drain', () => { file.end(complete); diff --git a/lib/appenders/fileSync.js b/lib/appenders/fileSync.js index 8b22909..dab551c 100755 --- a/lib/appenders/fileSync.js +++ b/lib/appenders/fileSync.js @@ -5,6 +5,7 @@ const layouts = require('../layouts'); const path = require('path'); const fs = require('fs'); const os = require('os'); + const eol = os.EOL || '\n'; class RollingFileSync { @@ -22,7 +23,7 @@ class RollingFileSync { this.filename = filename; this.size = size; this.backups = backups || 1; - this.options = options || { encoding: 'utf8', mode: parseInt('0644', 8), flags: 'a' }; + this.options = options || { encoding: 'utf8', mode: parseInt('0644', 8), flags: 'a' }; // eslint-disable-line this.currentSize = 0; function currentFileSize(file) { @@ -149,7 +150,7 @@ function fileAppender(file, layout, logSize, numBackups, timezoneOffset) { numFiles ); } else { - stream = ((f => { + stream = (((f) => { // create file if it doesn't exist if (!fs.existsSync(f)) { fs.appendFileSync(f, ''); @@ -168,7 +169,7 @@ function fileAppender(file, layout, logSize, numBackups, timezoneOffset) { const logFile = openTheStream(file, logSize, numBackups); - return loggingEvent => { + return (loggingEvent) => { logFile.write(layout(loggingEvent, timezoneOffset) + eol); }; } diff --git a/lib/appenders/gelf.js b/lib/appenders/gelf.js index 53ec7a4..eb809ed 100644 --- a/lib/appenders/gelf.js +++ b/lib/appenders/gelf.js @@ -1,4 +1,5 @@ 'use strict'; + const zlib = require('zlib'); const layouts = require('../layouts'); const levels = require('../levels'); @@ -41,7 +42,7 @@ let client; function gelfAppender(layout, host, port, hostname, facility) { let config; let customFields; - if (typeof(host) === 'object') { + if (typeof host === 'object') { config = host; host = config.host; port = config.port; @@ -76,7 +77,7 @@ function gelfAppender(layout, host, port, hostname, facility) { */ function addCustomFields(loggingEvent, msg) { /* append defaultCustomFields firsts */ - Object.keys(defaultCustomFields).forEach(key => { + Object.keys(defaultCustomFields).forEach((key) => { // skip _id field for graylog2, skip keys not starts with UNDERSCORE if (key.match(/^_/) && key !== '_id') { msg[key] = defaultCustomFields[key]; @@ -91,7 +92,7 @@ function gelfAppender(layout, host, port, hostname, facility) { if (!firstData.GELF) return; // identify with GELF field defined // Remove the GELF key, some gelf supported logging systems drop the message with it delete firstData.GELF; - Object.keys(firstData).forEach(key => { + Object.keys(firstData).forEach((key) => { // skip _id field for graylog2, skip keys not starts with UNDERSCORE if (key.match(/^_/) || key !== '_id') { msg[key] = firstData[key]; @@ -115,20 +116,20 @@ function gelfAppender(layout, host, port, hostname, facility) { } function sendPacket(packet) { - client.send(packet, 0, packet.length, port, host, err => { + client.send(packet, 0, packet.length, port, host, (err) => { if (err) { console.error(err); } }); } - return loggingEvent => { + return (loggingEvent) => { const message = preparePacket(loggingEvent); zlib.gzip(new Buffer(JSON.stringify(message)), (err, packet) => { if (err) { console.error(err.stack); } else { - if (packet.length > 8192) { + if (packet.length > 8192) { // eslint-disable-line debug(`Message packet length (${packet.length}) is larger than 8k. Not sending`); } else { sendPacket(packet); diff --git a/lib/appenders/hipchat.js b/lib/appenders/hipchat.js index 4b4e25b..8c3a3be 100644 --- a/lib/appenders/hipchat.js +++ b/lib/appenders/hipchat.js @@ -40,7 +40,7 @@ function hipchatAppender(config) { const notifier = hipchat.make(config.hipchat_room, config.hipchat_token); // @lint W074 This function's cyclomatic complexity is too high. (10) - return loggingEvent => { + return (loggingEvent) => { let notifierFn; notifier.setRoom(config.hipchat_room); diff --git a/lib/appenders/logFacesAppender.js b/lib/appenders/logFacesAppender.js index 49cd8e5..ba7bda6 100644 --- a/lib/appenders/logFacesAppender.js +++ b/lib/appenders/logFacesAppender.js @@ -1,123 +1,127 @@ /** -* logFaces appender sends JSON formatted log events to logFaces receivers. -* There are two types of receivers supported - raw UDP sockets (for server side apps), -* and HTTP (for client side apps). Depending on the usage, this appender -* requires either of the two: -* -* For UDP require 'dgram', see 'https://nodejs.org/api/dgram.html' -* For HTTP require 'axios', see 'https://www.npmjs.com/package/axios' -* -* Make sure your project have relevant dependancy installed before using this appender. -*/ + * logFaces appender sends JSON formatted log events to logFaces receivers. + * There are two types of receivers supported - raw UDP sockets (for server side apps), + * and HTTP (for client side apps). Depending on the usage, this appender + * requires either of the two: + * + * For UDP require 'dgram', see 'https://nodejs.org/api/dgram.html' + * For HTTP require 'axios', see 'https://www.npmjs.com/package/axios' + * + * Make sure your project have relevant dependancy installed before using this appender. + */ +/* eslint global-require:0 */ 'use strict'; const util = require('util'); + const context = {}; -function datagram(config){ - const sock = require('dgram').createSocket('udp4'); - const host = config.remoteHost || '127.0.0.1'; - const port = config.port || 55201; +function datagram(config) { + const sock = require('dgram').createSocket('udp4'); + const host = config.remoteHost || '127.0.0.1'; + const port = config.port || 55201; - return function(event){ - const buff = new Buffer(JSON.stringify(event)); - sock.send(buff, 0, buff.length, port, host, function(err, bytes) { - if(err){ - console.error('log4js.logFacesAppender failed to %s:%d, error: %s', - host, port, err); - } - }); - }; + return function (event) { + const buff = new Buffer(JSON.stringify(event)); + sock.send(buff, 0, buff.length, port, host, (err) => { + if (err) { + console.error('log4js.logFacesAppender failed to %s:%d, error: %s', + host, port, err); + } + }); + }; } -function servlet(config){ - const axios = require('axios').create(); - axios.defaults.baseURL = config.url; - axios.defaults.timeout = config.timeout || 5000; - axios.defaults.headers = {'Content-Type': 'application/json'}; - axios.defaults.withCredentials = true; +function servlet(config) { + const axios = require('axios').create(); + axios.defaults.baseURL = config.url; + axios.defaults.timeout = config.timeout || 5000; + axios.defaults.headers = { 'Content-Type': 'application/json' }; + axios.defaults.withCredentials = true; - return function(lfsEvent){ - axios.post("", lfsEvent) - .then(function(response){ - if(response.status != 200){ - console.error('log4js.logFacesAppender post to %s failed: %d', - config.url, response.status); - } + return function (lfsEvent) { + axios.post('', lfsEvent) + .then((response) => { + if (response.status !== 200) { + console.error('log4js.logFacesAppender post to %s failed: %d', + config.url, response.status); + } }) - .catch(function(response){ - console.error('log4js.logFacesAppender post to %s excepted: %s', - config.url, response.status); + .catch((response) => { + console.error('log4js.logFacesAppender post to %s excepted: %s', + config.url, response.status); }); - }; + }; } /** -* For UDP (node.js) use the following configuration params: -* { + * For UDP (node.js) use the following configuration params: + * { * "type": "logFacesAppender", // must be present for instantiation * "application": "LFS-TEST", // name of the application (domain) * "remoteHost": "127.0.0.1", // logFaces server address (hostname) * "port": 55201 // UDP receiver listening port * } -* -* For HTTP (browsers or node.js) use the following configuration params: -* { + * + * For HTTP (browsers or node.js) use the following configuration params: + * { * "type": "logFacesAppender", // must be present for instantiation * "application": "LFS-TEST", // name of the application (domain) * "url": "http://lfs-server/logs", // logFaces receiver servlet URL * } -*/ + */ function logFacesAppender(config) { - let send = config.send; - if(send === undefined){ - send = (config.url === undefined) ? datagram(config) : servlet(config); - } + let send = config.send; + if (send === undefined) { + send = (config.url === undefined) ? datagram(config) : servlet(config); + } - return function log(event) { - // convert to logFaces compact json format - const lfsEvent = { - a: config.application || '', // application name - t: event.startTime.getTime(), // time stamp - p: event.level.levelStr, // level (priority) - g: event.categoryName, // logger name - m: format(event.data) // message text - }; + return function log(event) { + // convert to logFaces compact json format + const lfsEvent = { + a: config.application || '', // application name + t: event.startTime.getTime(), // time stamp + p: event.level.levelStr, // level (priority) + g: event.categoryName, // logger name + m: format(event.data) // message text + }; - // add context variables if exist - Object.keys(context).forEach(function(key) { - lfsEvent[`p_${key}`] = context[key]; - }); + // add context variables if exist + Object.keys(context).forEach((key) => { + lfsEvent[`p_${key}`] = context[key]; + }); - // send to server - send(lfsEvent); - }; + // send to server + send(lfsEvent); + }; } function configure(config) { - return logFacesAppender(config); + return logFacesAppender(config); } -function setContext(key, value){ - context[key] = value; +function setContext(key, value) { + context[key] = value; } function format(logData) { const data = Array.isArray(logData) ? logData : Array.prototype.slice.call(arguments); - return util.format(...wrapErrorsWithInspect(data)); + return util.format.apply(util, wrapErrorsWithInspect(data)); } function wrapErrorsWithInspect(items) { - return items.map(function(item) { + return items.map((item) => { if ((item instanceof Error) && item.stack) { - return { inspect: function() { + return { + inspect: function () { return `${util.format(item)}\n${item.stack}`; - }}; - } else { - return item; + } + }; } + + return item; }); } diff --git a/lib/appenders/logLevelFilter.js b/lib/appenders/logLevelFilter.js index 0ce7946..ea0d420 100644 --- a/lib/appenders/logLevelFilter.js +++ b/lib/appenders/logLevelFilter.js @@ -6,7 +6,7 @@ const log4js = require('../log4js'); function logLevelFilter(minLevelString, maxLevelString, appender) { const minLevel = levels.toLevel(minLevelString); const maxLevel = levels.toLevel(maxLevelString, levels.FATAL); - return logEvent => { + return (logEvent) => { const eventLevel = logEvent.level; if (eventLevel.isGreaterThanOrEqualTo(minLevel) && eventLevel.isLessThanOrEqualTo(maxLevel)) { appender(logEvent); diff --git a/lib/appenders/loggly.js b/lib/appenders/loggly.js index 23af8d7..319ffbe 100644 --- a/lib/appenders/loggly.js +++ b/lib/appenders/loggly.js @@ -1,19 +1,23 @@ +/* eslint no-prototype-builtins:1,no-restricted-syntax:[1, "ForInStatement"] */ + 'use strict'; + const layouts = require('../layouts'); const loggly = require('loggly'); const os = require('os'); -const passThrough = layouts.messagePassThroughLayout; +const passThrough = layouts.messagePassThroughLayout; function isAnyObject(value) { return value !== null && (typeof value === 'object' || typeof value === 'function'); } -/* eslint no-prototype-builtins:1,no-restricted-syntax:[1, "ForInStatement"] */ function numKeys(obj) { let res = 0; for (const key in obj) { - if (obj.hasOwnProperty(key)) res++; + if (obj.hasOwnProperty(key)) { + res++; // eslint-disable-line no-plusplus + } } return res; } @@ -59,7 +63,7 @@ function logglyAppender(config, layout) { const client = loggly.createClient(config); if (!layout) layout = passThrough; - return loggingEvent => { + return (loggingEvent) => { const result = processTags(loggingEvent.data); const deTaggedData = result.deTaggedData; const additionalTags = result.additionalTags; diff --git a/lib/appenders/logstashUDP.js b/lib/appenders/logstashUDP.js index a1cc3d1..642367c 100644 --- a/lib/appenders/logstashUDP.js +++ b/lib/appenders/logstashUDP.js @@ -1,4 +1,5 @@ 'use strict'; + const layouts = require('../layouts'); const dgram = require('dgram'); const util = require('util'); diff --git a/lib/appenders/mailgun.js b/lib/appenders/mailgun.js index 1f58392..11341ff 100644 --- a/lib/appenders/mailgun.js +++ b/lib/appenders/mailgun.js @@ -11,7 +11,7 @@ function mailgunAppender(_config, _layout) { config = _config; layout = _layout || layouts.basicLayout; - return loggingEvent => { + return (loggingEvent) => { const data = { from: _config.from, to: _config.to, diff --git a/lib/appenders/multiprocess.js b/lib/appenders/multiprocess.js index 62cfb65..3fa8ed5 100644 --- a/lib/appenders/multiprocess.js +++ b/lib/appenders/multiprocess.js @@ -2,6 +2,7 @@ const log4js = require('../log4js'); const net = require('net'); + const END_MSG = '__LOG4JS__'; /** diff --git a/lib/appenders/slack.js b/lib/appenders/slack.js index cb32665..ae366cd 100644 --- a/lib/appenders/slack.js +++ b/lib/appenders/slack.js @@ -2,14 +2,14 @@ const Slack = require('slack-node'); const layouts = require('../layouts'); -let layout; +let layout; let slack; function slackAppender(_config, _layout) { layout = _layout || layouts.basicLayout; - return loggingEvent => { + return (loggingEvent) => { const data = { channel_id: _config.channel_id, text: layout(loggingEvent, _config.timezoneOffset), diff --git a/lib/appenders/smtp.js b/lib/appenders/smtp.js index 0a5b39e..dca9a3f 100644 --- a/lib/appenders/smtp.js +++ b/lib/appenders/smtp.js @@ -49,7 +49,7 @@ function sendBuffer() { if (config.sender) { msg.from = config.sender; } - transport.sendMail(msg, error => { + transport.sendMail(msg, (error) => { if (error) { console.error('log4js.smtpAppender - Error happened', error); } @@ -68,7 +68,7 @@ function getTransportOptions() { const transportModule = `nodemailer-${plugin}-transport`; /* eslint global-require:0 */ - const transporter = require(transportModule); + const transporter = require(transportModule); // eslint-disable-line transportOpts = transporter(config.transport.options); } @@ -111,8 +111,8 @@ function smtpAppender(_config, _layout) { shutdownTimeout = ('shutdownTimeout' in config ? config.shutdownTimeout : 5) * 1000; - return loggingEvent => { - unsentCount++; + return (loggingEvent) => { + unsentCount++; // eslint-disable-line no-plusplus logEventBuffer.push(loggingEvent); if (sendInterval > 0) { scheduleSend(); diff --git a/lib/appenders/stderr.js b/lib/appenders/stderr.js index 704e78c..8944468 100644 --- a/lib/appenders/stderr.js +++ b/lib/appenders/stderr.js @@ -4,7 +4,7 @@ const layouts = require('../layouts'); function stderrAppender(layout, timezoneOffset) { layout = layout || layouts.colouredLayout; - return loggingEvent => { + return (loggingEvent) => { process.stderr.write(`${layout(loggingEvent, timezoneOffset)}\n`); }; } diff --git a/lib/appenders/stdout.js b/lib/appenders/stdout.js index 888b916..124ac97 100644 --- a/lib/appenders/stdout.js +++ b/lib/appenders/stdout.js @@ -1,16 +1,16 @@ -"use strict"; +'use strict'; -var layouts = require('../layouts'); +const layouts = require('../layouts'); function stdoutAppender(layout, timezoneOffset) { layout = layout || layouts.colouredLayout; - return function(loggingEvent) { - process.stdout.write(layout(loggingEvent, timezoneOffset) + '\n'); + return function (loggingEvent) { + process.stdout.write(`${layout(loggingEvent, timezoneOffset)}\n`); }; } function configure(config) { - var layout; + let layout; if (config.layout) { layout = layouts.layout(config.layout.type, config.layout); } diff --git a/lib/connect-logger.js b/lib/connect-logger.js index abeba12..2c60d3c 100755 --- a/lib/connect-logger.js +++ b/lib/connect-logger.js @@ -1,6 +1,9 @@ +/* eslint-disable no-plusplus */ + 'use strict'; const levels = require('./levels'); + const DEFAULT_FORMAT = ':remote-addr - -' + ' ":method :url HTTP/:http-version"' + ' :status :content-length ":referrer"' + @@ -120,7 +123,7 @@ function getLogger(logger4js, options) { * @return {Array} */ function assembleTokens(req, res, customTokens) { - const arrayUniqueTokens = array => { + const arrayUniqueTokens = (array) => { const a = array.concat(); for (let i = 0; i < a.length; ++i) { for (let j = i + 1; j < a.length; ++j) { @@ -169,16 +172,16 @@ function assembleTokens(req, res, customTokens) { '-' }); defaultTokens.push({ - token: /:req\[([^\]]+)\]/g, + token: /:req\[([^\]]+)]/g, replacement: function (_, field) { return req.headers[field.toLowerCase()]; } }); defaultTokens.push({ - token: /:res\[([^\]]+)\]/g, + token: /:res\[([^\]]+)]/g, replacement: function (_, field) { return res._headers ? - (res._headers[field.toLowerCase()] || res.__headers[field]) + (res._headers[field.toLowerCase()] || res.__headers[field]) : (res.__headers && res.__headers[field]); } }); diff --git a/lib/date_format.js b/lib/date_format.js index 0611adb..8ff1df8 100644 --- a/lib/date_format.js +++ b/lib/date_format.js @@ -37,7 +37,7 @@ function offset(timezoneOffset) { } module.exports.asString = function (format, date, timezoneOffset) { - if (typeof(format) !== 'string') { + if (typeof format !== 'string') { timezoneOffset = date; date = format; format = module.exports.ISO8601_FORMAT; diff --git a/lib/layouts.js b/lib/layouts.js index 8e81688..8e04bb1 100644 --- a/lib/layouts.js +++ b/lib/layouts.js @@ -2,17 +2,28 @@ const dateFormat = require('./date_format'); const os = require('os'); -const eol = os.EOL || '\n'; const util = require('util'); + +const eol = os.EOL || '\n'; const layoutMakers = { - messagePassThrough: function () { return messagePassThroughLayout; }, - basic: function () { return basicLayout; }, - colored: function () { return colouredLayout; }, - coloured: function () { return colouredLayout; }, + messagePassThrough: function () { + return messagePassThroughLayout; + }, + basic: function () { + return basicLayout; + }, + colored: function () { + return colouredLayout; + }, + coloured: function () { + return colouredLayout; + }, pattern: function (config) { return patternLayout(config && config.pattern, config && config.tokens); }, - dummy: function () { return dummyLayout; } + dummy: function () { + return dummyLayout; + } }; const colours = { ALL: 'grey', @@ -27,15 +38,11 @@ const colours = { const semver = require('semver'); function wrapErrorsWithInspect(items) { - return items.map(item => { + return items.map((item) => { if ((item instanceof Error) && item.stack) { return { inspect: function () { - if (semver.satisfies(process.version, '>=6')) { - return util.format(item); - } else { - return util.format(item) + '\n' + item.stack; - } + return semver.satisfies(process.version, '>=6') ? util.format(item) : `${util.format(item)}\n${item.stack}`; } }; } @@ -50,7 +57,7 @@ function formatLogData(logData) { if (!Array.isArray(data)) { const numArgs = arguments.length; data = new Array(numArgs); - for (let i = 0; i < numArgs; i++) { + for (let i = 0; i < numArgs; i++) { // eslint-disable-line no-plusplus data[i] = arguments[i]; } } @@ -174,7 +181,7 @@ function dummyLayout(loggingEvent) { */ function patternLayout(pattern, tokens, timezoneOffset) { const TTCC_CONVERSION_PATTERN = '%r %p %c - %m%n'; - const regex = /%(-?[0-9]+)?(\.?[0-9]+)?([\[\]cdhmnprzxy%])(\{([^\}]+)\})?|([^%]+)/; + const regex = /%(-?[0-9]+)?(\.?[0-9]+)?([[\]cdhmnprzxy%])(\{([^}]+)\})?|([^%]+)/; pattern = pattern || TTCC_CONVERSION_PATTERN; @@ -259,8 +266,8 @@ function patternLayout(pattern, tokens, timezoneOffset) { } function userDefined(loggingEvent, specifier) { - if (typeof(tokens[specifier]) !== 'undefined') { - return typeof(tokens[specifier]) === 'function' ? tokens[specifier](loggingEvent) : tokens[specifier]; + if (typeof tokens[specifier] !== 'undefined') { + return typeof tokens[specifier] === 'function' ? tokens[specifier](loggingEvent) : tokens[specifier]; } return null; diff --git a/lib/log4js.js b/lib/log4js.js index 3b01bd3..e18c62b 100644 --- a/lib/log4js.js +++ b/lib/log4js.js @@ -1,4 +1,5 @@ -/* eslint no-prototype-builtins:1,no-restricted-syntax:[1, "ForInStatement"] */ +/* eslint no-prototype-builtins:1,no-restricted-syntax:[1, "ForInStatement"],no-plusplus:0 */ + 'use strict'; /** @@ -36,9 +37,10 @@ const util = require('util'); const layouts = require('./layouts'); const levels = require('./levels'); const loggerModule = require('./logger'); -const Logger = loggerModule.Logger; const connectLogger = require('./connect-logger').connectLogger; +const Logger = loggerModule.Logger; + require('./appenders/console'); const ALL_CATEGORIES = '[all]'; @@ -81,12 +83,24 @@ function getBufferedLogger(categoryName) { delete logger.temp[i]; } }; - logger.trace = function (message) { logger.temp.push({ level: 'trace', message: message }); }; - logger.debug = function (message) { logger.temp.push({ level: 'debug', message: message }); }; - logger.info = function (message) { logger.temp.push({ level: 'info', message: message }); }; - logger.warn = function (message) { logger.temp.push({ level: 'warn', message: message }); }; - logger.error = function (message) { logger.temp.push({ level: 'error', message: message }); }; - logger.fatal = function (message) { logger.temp.push({ level: 'fatal', message: message }); }; + logger.trace = function (message) { + logger.temp.push({ level: 'trace', message: message }); + }; + logger.debug = function (message) { + logger.temp.push({ level: 'debug', message: message }); + }; + logger.info = function (message) { + logger.temp.push({ level: 'info', message: message }); + }; + logger.warn = function (message) { + logger.temp.push({ level: 'warn', message: message }); + }; + logger.error = function (message) { + logger.temp.push({ level: 'error', message: message }); + }; + logger.fatal = function (message) { + logger.temp.push({ level: 'fatal', message: message }); + }; return logger; } @@ -146,14 +160,18 @@ function getLogger(loggerCategoryName) { for (const appenderCategory in appenders) { if (doesAppenderContainsLogger(appenderCategory, loggerCategoryName)) { appenderList = appenders[appenderCategory]; - appenderList.forEach(appender => { loggers[loggerCategoryName].addListener('log', appender); }); + appenderList.forEach((appender) => { + loggers[loggerCategoryName].addListener('log', appender); + }); } } /* jshint +W083 */ if (appenders[ALL_CATEGORIES]) { appenderList = appenders[ALL_CATEGORIES]; - appenderList.forEach(appender => { loggers[loggerCategoryName].addListener('log', appender); }); + appenderList.forEach((appender) => { + loggers[loggerCategoryName].addListener('log', appender); + }); } } @@ -176,7 +194,7 @@ function addAppender() { args = args[0]; } - args.forEach(appenderCategory => { + args.forEach((appenderCategory) => { addAppenderToCategory(appender, appenderCategory); if (appenderCategory === ALL_CATEGORIES) { @@ -218,7 +236,7 @@ function clearAppenders() { function configureAppenders(appenderList, options) { clearAppenders(); if (appenderList) { - appenderList.forEach(appenderConfig => { + appenderList.forEach((appenderConfig) => { loadAppender(appenderConfig.type); let appender; appenderConfig.makers = appenderMakers; @@ -330,13 +348,13 @@ function configure(configurationFileOrObject, options) { config = config || process.env.LOG4JS_CONFIG; options = options || {}; - if (config === undefined || config === null || typeof(config) === 'string') { + if (config === undefined || config === null || typeof config === 'string') { if (options.reloadSecs) { initReloadConfiguration(config, options); } config = loadConfigurationFile(config) || defaultConfig; } else { - if (options.reloadSecs) { + if (options.reloadSecs) { // eslint-disable-line getLogger('log4js').warn( 'Ignoring configuration reload parameter for "object" configuration.' ); @@ -364,13 +382,15 @@ function replaceConsole(logger) { logger = logger || getLogger('console'); - ['log', 'debug', 'info', 'warn', 'error'].forEach(item => { + ['log', 'debug', 'info', 'warn', 'error'].forEach((item) => { console[item] = replaceWith(item === 'log' ? logger.info : logger[item]); }); } function restoreConsole() { - ['log', 'debug', 'info', 'warn', 'error'].forEach(item => { console[item] = originalConsoleFunctions[item]; }); + ['log', 'debug', 'info', 'warn', 'error'].forEach((item) => { + console[item] = originalConsoleFunctions[item]; + }); } /* eslint global-require:0 */ @@ -386,9 +406,9 @@ function restoreConsole() { function requireAppender(appender) { let appenderModule; try { - appenderModule = require(`./appenders/${appender}`); + appenderModule = require(`./appenders/${appender}`); // eslint-disable-line } catch (e) { - appenderModule = require(appender); + appenderModule = require(appender); // eslint-disable-line } return appenderModule; } @@ -430,7 +450,7 @@ function shutdown(cb) { // not being able to be drained because of run-away log writes. loggerModule.disableAllLogWrites(); - //turn off config reloading + // turn off config reloading if (configState.timerId) { clearInterval(configState.timerId); } @@ -458,7 +478,9 @@ function shutdown(cb) { return cb(); } - shutdownFunctions.forEach(shutdownFct => { shutdownFct(complete); }); + shutdownFunctions.forEach((shutdownFct) => { + shutdownFct(complete); + }); return null; } diff --git a/lib/logger.js b/lib/logger.js index 437b08c..1da0cae 100644 --- a/lib/logger.js +++ b/lib/logger.js @@ -1,8 +1,10 @@ /* eslint no-underscore-dangle:0 */ + 'use strict'; const levels = require('./levels'); const EventEmitter = require('events'); + const DEFAULT_CATEGORY = '[default]'; let logWritesEnabled = true; @@ -84,7 +86,7 @@ class Logger extends EventEmitter { Logger.DEFAULT_CATEGORY = DEFAULT_CATEGORY; Logger.prototype.level = levels.TRACE; -['Trace','Debug','Info','Warn','Error','Fatal', 'Mark'].forEach(addLevelMethods); +['Trace', 'Debug', 'Info', 'Warn', 'Error', 'Fatal', 'Mark'].forEach(addLevelMethods); function addLevelMethods(target) { const level = levels.toLevel(target); diff --git a/package.json b/package.json index 5ffded3..4a14284 100644 --- a/package.json +++ b/package.json @@ -38,9 +38,9 @@ }, "devDependencies": { "conventional-changelog": "^1.1.0", - "eslint": "^3.0.0", - "eslint-config-airbnb-base": "^4.0.0", - "eslint-plugin-import": "^1.5.0", + "eslint": "^3.12.0", + "eslint-config-airbnb-base": "^11.0.0", + "eslint-plugin-import": "^2.0.0", "ghooks": "^1.2.1", "sandboxed-module": "0.3.0", "tape": "^4.6.2", @@ -51,8 +51,8 @@ "hipchat-notifier": "^1.1.0", "loggly": "^1.1.0", "mailgun-js": "^0.7.0", - "slack-node": "~0.2.0", - "nodemailer": "^2.5.0" + "nodemailer": "^2.5.0", + "slack-node": "~0.2.0" }, "browser": { "os": false