From b4540710d9ba0f237e2c7f6cf34e3a43de7f7541 Mon Sep 17 00:00:00 2001 From: Harrison Van Date: Thu, 22 Nov 2018 16:42:23 +0800 Subject: [PATCH 1/4] feature: support winston 3 (#1) * remove winston.clone Update README.md for winston 3.0 * Update package.json dependencies * Update package.json dependencies * Add new flag * Update README for new flag * Fixed #49 * Added package-lock * Updated transport for winston 3.0 * Added clone to replace winston.clone * Modified test suite and updated deps. * Small fixes. * Package versions * Update node-loggly-bulk package dependency * Use node-loggly-bulk's beta package * Use node-loggly-bulk's latest release * chore: reformat --- .gitignore | 5 +- README.md | 28 +- lib/winston-loggly.js | 147 ++++---- package-lock.json | 721 ++++++++++++++++++++++++++++++++++++ package.json | 29 +- test/helpers.js | 79 ++++ test/winston-loggly-test.js | 32 +- 7 files changed, 944 insertions(+), 97 deletions(-) mode change 100644 => 100755 lib/winston-loggly.js create mode 100644 package-lock.json create mode 100644 test/helpers.js diff --git a/.gitignore b/.gitignore index ef5c7c4..7a66200 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ +.idea/ +.DS_Store + test/config.json + node_modules npm-debug.log -.DS_Store \ No newline at end of file diff --git a/README.md b/README.md index 1021b6a..3147adc 100644 --- a/README.md +++ b/README.md @@ -20,9 +20,9 @@ Please note that the documentation below is for `winston-loggly-bulk@2.x`. [Read // Requiring `winston-loggly-bulk` will expose // `winston.transports.Loggly` // - require('winston-loggly-bulk'); + var {Loggly} = require('winston-loggly-bulk'); - winston.add(winston.transports.Loggly, options); + winston.add(new Loggly({options})); ``` The Loggly transport is based on [Nodejitsu's][2] [node-loggly][3] implementation of the [Loggly][0] API. If you haven't heard of Loggly before, you should probably read their [value proposition][4]. The Loggly transport takes the following options. Either 'inputToken' or 'inputName' is required: @@ -45,6 +45,22 @@ The Loggly transport is based on [Nodejitsu's][2] [node-loggly][3] implementatio *Metadata:* Logged in suggested [Loggly format][5] +## Sample Working Code Snippet + +``` js +var winston = require('winston'); +var {Loggly} = require('winston-loggly-bulk'); + +winston.add(new Loggly({ + token: "TOKEN", + subdomain: "SUBDOMAIN", + tags: ["Winston-NodeJS"], + json: true +})); + +winston.log('info', "Hello World from Node.js!"); +``` + ## Buffer Support This library has buffer support during temporary network outage. User can configure size of buffer (no. of logs to be stored during network outage). @@ -65,11 +81,11 @@ Our library uses ajax requests to send logs to Loggly, and as ajax requests take Here is an example of how to use the method: ``` js -var winston = require('winston'), -winlog = require('winston-loggly-bulk'); +var winston = require('winston'); +var {flushLogsAndExit} = require('winston-loggly-bulk'); -winston.log("info", "hello World"); -winlog.flushLogsAndExit(); +winston.log("info", "Hello World from Node.js!"); +flushLogsAndExit(); ``` diff --git a/lib/winston-loggly.js b/lib/winston-loggly.js old mode 100644 new mode 100755 index ca82fb8..6175447 --- a/lib/winston-loggly.js +++ b/lib/winston-loggly.js @@ -6,11 +6,12 @@ * */ -var events = require('events'), - loggly = require('node-loggly-bulk'), - util = require('util'), - winston = require('winston'), - Stream = require('stream').Stream; +var clone = require('clone'), + loggly = require('node-loggly-bulk'), + util = require('util'), + winston = require('winston'), + Transport = require('winston-transport'), + Stream = require('stream').Stream; // // Remark: This should be at a higher level. @@ -35,7 +36,7 @@ var Loggly = exports.Loggly = function (options) { options.token = options.inputToken; } - winston.Transport.call(this, options); + Transport.call(this, options); if (!options.subdomain) { throw new Error('Loggly Subdomain is required'); } @@ -43,7 +44,7 @@ var Loggly = exports.Loggly = function (options) { throw new Error('Loggly Customer token is required.'); } - this.name = 'loggly'; + this.name = 'loggly'; var tags = options.tags || options.tag || options.id; if (tags && !Array.isArray(tags)) { tags = [tags]; @@ -57,11 +58,11 @@ var Loggly = exports.Loggly = function (options) { token: options.token, tags: tags, isBulk: options.isBulk || false, - bufferOptions: options.bufferOptions || {size: 500, retriesInMilliSeconds: 30 * 1000}, + bufferOptions: options.bufferOptions || { size: 500, retriesInMilliSeconds: 30 * 1000 }, networkErrorsOnConsole: options.networkErrorsOnConsole || false }); - this.timestamp = options.timestamp === false ? false : true; + this.timestamp = options.timestamp !== false; this.stripColors = options.stripColors || false; }; @@ -70,17 +71,17 @@ var Loggly = exports.Loggly = function (options) { // 10 seconds. // var flushLogsAndExit = exports.flushLogsAndExit = function () { - if (timerFunctionForProcessExit === null) { - timerFunctionForProcessExit = setInterval(function () { - process.exit(); - },10000); - } -} + if (timerFunctionForProcessExit === null) { + timerFunctionForProcessExit = setInterval(function () { + process.exit(); + }, 10000); + } +}; // // Inherit from `winston.Transport`. // -util.inherits(Loggly, winston.Transport); +util.inherits(Loggly, Transport); // // Define a getter so that `winston.transports.Loggly` @@ -94,6 +95,16 @@ winston.transports.flushLogsAndExit = flushLogsAndExit; // Loggly.prototype.name = 'loggly'; +const validateMetadata = (meta) => { + if (meta == null) { + return {}; + } else if (typeof meta !== 'object') { + return { metadata: meta }; + } else { + return clone(meta); + } +}; + // // ### function log (level, msg, [meta], callback) // #### @level {string} Level at which to log the message. @@ -103,21 +114,22 @@ Loggly.prototype.name = 'loggly'; // Core logging method exposed to Winston. Metadata is optional. // Loggly.prototype.log = function (level, msg, meta, callback) { + + const message = validateMetadata(meta); + if (this.silent) { return callback(null, true); } - if (this.timestamp && (!meta || !meta.timestamp)) { - meta = meta || {}; - meta.timestamp = (new Date()).toISOString(); + if (this.timestamp && !message.timestamp) { + message.timestamp = (new Date()).toISOString(); } if (this.stripColors) { msg = ('' + msg).replace(code, ''); } - var message = winston.clone(meta || {}), - self = this; + const self = this; message.level = level; message.message = msg || message.message; @@ -130,7 +142,7 @@ Loggly.prototype.log = function (level, msg, meta, callback) { callback(err, true); } - return meta && meta.tags + return (meta && meta.tags) ? this.client.log(message, meta.tags, logged) : this.client.log(message, logged); }; @@ -140,13 +152,13 @@ Loggly.prototype.log = function (level, msg, meta, callback) { // #### @options {Object} Set stream options // Returns a log stream. // -Loggly.prototype.stream = function(options) { +Loggly.prototype.stream = function (maybeOptions) { var self = this, - options = options || {}, - stream = new Stream, - last, - start = options.start, - row = 0; + options = maybeOptions || {}, + stream = new Stream, + last, + start = options.start, + row = 0; if (start === -1) { start = null; @@ -156,7 +168,7 @@ Loggly.prototype.stream = function(options) { last = new Date(0).toISOString(); } - stream.destroy = function() { + stream.destroy = function () { this.destroyed = true; }; @@ -166,7 +178,7 @@ Loggly.prototype.stream = function(options) { self.query({ from: last || 'NOW-1DAY', until: 'NOW' - }, function(err, results) { + }, function (err, results) { if (stream.destroyed) return; if (err) { @@ -174,7 +186,7 @@ Loggly.prototype.stream = function(options) { return setTimeout(check, 2000); } - var result = res[res.length-1]; + var result = results[results.length - 1]; if (result && result.timestamp) { if (last == null) { last = result.timestamp; @@ -182,10 +194,10 @@ Loggly.prototype.stream = function(options) { } last = result.timestamp; } else { - return func(); + return; } - results.forEach(function(log) { + results.forEach(function (log) { if (start == null || row > start) { stream.emit('log', log); } @@ -208,9 +220,9 @@ Loggly.prototype.stream = function(options) { Loggly.prototype.query = function (options, callback) { var self = this, - context = this.extractContext(options); - options = this.loglify(options); - options = this.extend(options, context); + context = this.extractContext(options); + options = this.loglify(options); + options = this.extend(options, context); this.client .search(options) @@ -235,10 +247,10 @@ Loggly.prototype.formatQuery = function (query) { // ### function formatResults (results, options) // #### @results {Object|Array} Results returned from `.query`. // #### @options {Object} **Optional** Formatting options -// Formats the specified `results` with the given `options` accordinging +// Formats the specified `results` with the given `options` according // to the implementation of this transport. // -Loggly.prototype.formatResults = function (results, options) { +Loggly.prototype.formatResults = function (results, _options) { return results; }; @@ -252,15 +264,14 @@ Loggly.prototype.formatResults = function (results, options) { Loggly.prototype.extractContext = function (obj) { var context = {}; - - ['start', - 'from', - 'until', - 'order', - 'callback', - 'size', - 'format', - 'fields'].forEach(function (key) { + ['start', + 'from', + 'until', + 'order', + 'callback', + 'size', + 'format', + 'fields'].forEach(function (key) { if (obj[key]) { context[key] = obj[key]; delete obj[key]; @@ -271,14 +282,13 @@ Loggly.prototype.extractContext = function (obj) { context.from = context.from.toISOString(); context.until = context.until.toISOString(); - context.from = context.from || '-1d'; + context.from = context.from || '-1d'; context.until = context.until || 'now'; - context.size = context.size || 50; + context.size = context.size || 50; return context; }; - // // ### function loglify (obj) // #### @obj {Object} Search query to convert into an `AND` loggly query. @@ -291,26 +301,25 @@ Loggly.prototype.loglify = function (obj) { Object.keys(obj).forEach(function (key) { if (key !== 'query' && - key !== 'fields' && - key !== 'start' && - key !== 'rows' && - key !== 'limit' && - key !== 'from' && - key !== 'until') - { - if (key == 'tag') { - opts.push(key + ':' + obj[key]); - } - else { - opts.push('json.' + key + ':' + obj[key]); - } + key !== 'fields' && + key !== 'start' && + key !== 'rows' && + key !== 'limit' && + key !== 'from' && + key !== 'until') { + if (key == 'tag') { + opts.push(key + ':' + obj[key]); + } + else { + opts.push('json.' + key + ':' + obj[key]); + } } }); if (obj.query) { opts.unshift(obj.query); } - return {'query' : opts.join(' AND ')} + return { 'query': opts.join(' AND ') }; }; // @@ -327,8 +336,8 @@ Loggly.prototype.sanitizeLogs = function (logs) { return logs; }; -Loggly.prototype.extend = function(destination,source) { - for (var property in source) - destination[property] = source[property]; - return destination; -} +Loggly.prototype.extend = function (destination, source) { + for (var property in source) + destination[property] = source[property]; + return destination; +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5901ed9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,721 @@ +{ + "name": "winston-loggly-bulk", + "version": "3.0.0-rc1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "ajv": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", + "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colornames": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", + "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=", + "dev": true + }, + "colors": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", + "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", + "dev": true + }, + "colorspace": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.1.tgz", + "integrity": "sha512-pI3btWyiuz7Ken0BWh9Elzsmv2bM9AhA7psXib4anUXy/orfZ/E0MbQwhSOG/9L8hLlalqrU0UhOuqxW1YjmVw==", + "dev": true, + "requires": { + "color": "3.0.x", + "text-hex": "1.0.x" + } + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "diagnostics": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", + "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", + "dev": true, + "requires": { + "colorspace": "1.1.x", + "enabled": "1.0.x", + "kuler": "1.0.x" + } + }, + "diff": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.8.tgz", + "integrity": "sha1-NDJ2MI7Jkbe8giZ+1VvBQR+XFmY=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "enabled": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", + "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", + "dev": true, + "requires": { + "env-variable": "0.0.x" + } + }, + "env-variable": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", + "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==", + "dev": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-safe-stringify": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", + "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==", + "dev": true + }, + "fecha": { + "version": "2.3.3", + "resolved": "http://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", + "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kuler": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", + "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", + "dev": true, + "requires": { + "colornames": "^1.1.1" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "logform": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-1.10.0.tgz", + "integrity": "sha512-em5ojIhU18fIMOw/333mD+ZLE2fis0EzXl1ZwHx4iQzmpQi6odNiY/t+ITNr33JZhT9/KEaH+UPIipr6a9EjWg==", + "dev": true, + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^2.3.3", + "ms": "^2.1.1", + "triple-beam": "^1.2.0" + } + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "requires": { + "mime-db": "~1.37.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node-loggly-bulk": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/node-loggly-bulk/-/node-loggly-bulk-2.2.4.tgz", + "integrity": "sha512-DfhtsDfkSBU6Dp1zvK+H1MgHRcA2yb4z07ctyA6uo+bNwKtv1exhohN910zcWNkdSYq1TImCq+O+3bOTuYHvmQ==", + "requires": { + "json-stringify-safe": "5.0.x", + "moment": "^2.18.1", + "request": ">=2.76.0 <3.0.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "one-time": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", + "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "sshpk": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", + "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vows": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/vows/-/vows-0.8.2.tgz", + "integrity": "sha1-aR95qybM3oC6cm3en+yOc9a88us=", + "dev": true, + "requires": { + "diff": "~1.0.8", + "eyes": "~0.1.6", + "glob": "^7.1.2" + } + }, + "winston": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.1.0.tgz", + "integrity": "sha512-FsQfEE+8YIEeuZEYhHDk5cILo1HOcWkGwvoidLrDgPog0r4bser1lEIOco2dN9zpDJ1M88hfDgZvxe5z4xNcwg==", + "dev": true, + "requires": { + "async": "^2.6.0", + "diagnostics": "^1.1.1", + "is-stream": "^1.1.0", + "logform": "^1.9.1", + "one-time": "0.0.4", + "readable-stream": "^2.3.6", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.2.0" + } + }, + "winston-transport": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.2.0.tgz", + "integrity": "sha512-0R1bvFqxSlK/ZKTH86nymOuKv/cT1PQBMuDdA7k7f0S9fM44dNH6bXnuxwXPrN8lefJgtZq08BKdyZ0DZIy/rg==", + "requires": { + "readable-stream": "^2.3.6", + "triple-beam": "^1.2.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/package.json b/package.json index e6accdb..6cbbb33 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "winston-loggly-bulk", - "version": "2.0.3", + "version": "3.0.0-rc1", "description": "A Loggly transport for winston", "author": "Loggly ", "contributors": [ @@ -19,15 +19,30 @@ "type": "git", "url": "https://github.com/loggly/winston-loggly-bulk.git" }, - "keywords": ["loggly", "logging", "sysadmin", "tools", "winston"], + "keywords": [ + "loggly", + "logging", + "sysadmin", + "tools", + "winston" + ], "dependencies": { - "node-loggly-bulk": "^2.0.1", - "winston": "^2.3.1" + "clone": "2.1.2", + "node-loggly-bulk": "2.2.4", + "winston-transport": "4.2.0" }, "devDependencies": { - "vows": "0.8.0" + "vows": "0.8.2", + "winston": "3.1.0" + }, + "peerDependencies": { + "winston": "3.1.0" }, "main": "./lib/winston-loggly", - "scripts": { "test": "vows --spec" }, - "engines": { "node": ">= 0.8.0" } + "scripts": { + "test": "vows --spec" + }, + "engines": { + "node": ">= 6.4.0" + } } diff --git a/test/helpers.js b/test/helpers.js new file mode 100644 index 0000000..fb366ee --- /dev/null +++ b/test/helpers.js @@ -0,0 +1,79 @@ +const winston = require('winston'); +module.exports.testLevels = function (transport, assertMsg, assertFn) { + var tests = {}; + const levels = winston.config.npm.levels; + + Object.keys(levels).forEach(function (level) { + var test = { + topic: function () { + transport.log(level, 'test message', {}, this.callback.bind(this, null)); + } + }; + + test[assertMsg] = assertFn; + tests['with the ' + level + ' level'] = test; + }); + + var metadatatest = { + topic: function () { + transport.log('info', 'test message', { metadata: true }, this.callback.bind(this, null)); + } + }; + + metadatatest[assertMsg] = assertFn; + tests['when passed metadata'] = metadatatest; + + var primmetadatatest = { + topic: function () { + transport.log('info', 'test message', 'metadata', this.callback.bind(this, null)); + } + }; + + primmetadatatest[assertMsg] = assertFn; + tests['when passed primitive metadata'] = primmetadatatest; + + var nummetadatatest = { + topic: function () { + transport.log('info', 'test message', 123456789, this.callback.bind(this, null)); + } + }; + + nummetadatatest[assertMsg] = assertFn; + tests['when passed numeric metadata'] = nummetadatatest; + +// circular references aren't supportded by regular JSON, and it's not supported +// by node-loggly-bulk. I'm omitting it for now. If it wants to be fixed, then +// node-loggly-bulk needs an update. + /* + var circmetadata = { }; + circmetadata['metadata'] = circmetadata; + + var circmetadatatest = { + topic: function () { + transport.log('info', 'circular message', circmetadata, this.callback.bind(this, null)); + } + }; + + circmetadatatest[assertMsg] = assertFn; + tests['when passed circular metadata'] = circmetadatatest; + + var circerror = new Error("message!"); + var foo = {}; + var circerrordatatest; + + foo.bar = foo; + circerror.foo = foo; + circerror.stack = 'Some stacktrace'; + + circerrordatatest = { + topic: function () { + transport.log('info', 'circular error', circerror, this.callback.bind(this, null)); + } + }; + + circerrordatatest[assertMsg] = assertFn; + tests['when passed circular error as metadata'] = circerrordatatest; + */ + + return tests; +}; diff --git a/test/winston-loggly-test.js b/test/winston-loggly-test.js index 55eb1d5..c10dc77 100644 --- a/test/winston-loggly-test.js +++ b/test/winston-loggly-test.js @@ -6,22 +6,20 @@ * */ -var path = require('path'), - vows = require('vows'), - assert = require('assert'), - winston = require('winston'), - helpers = require('winston/test/helpers'), - Loggly = require('../lib/winston-loggly').Loggly; +var vows = require('vows'), + assert = require('assert'), + helpers = require('./helpers.js'), + Loggly = require('../lib/winston-loggly').Loggly; var tokenTransport, - config; + config; try { config = require('./config'); } catch (ex) { - console.log('Error reading test/config.json.') - console.log('Are you sure it exists?\n'); + console.error('Error reading test/config.json.'); + console.error('Are you sure it exists?\n'); console.dir(ex); process.exit(1); } @@ -31,21 +29,27 @@ tokenTransport = new (Loggly)({ token: config.transports.loggly.token }); +tokenTransport.log('warning', 'test message', {}, (_err, _res) => { +}); + function assertLoggly(transport) { assert.instanceOf(transport, Loggly); assert.isFunction(transport.log); } vows.describe('winston-loggly').addBatch({ - "An instance of the Loggly Transport": { - "when passed an input token": { - "should have the proper methods defined": function () { + 'An instance of the Loggly Transport': { + 'when passed an input token': { + 'should have the proper methods defined': function () { assertLoggly(tokenTransport); }, - "the log() method": helpers.testNpmLevels(tokenTransport, "should log messages to loggly", function (ign, err, logged) { + 'the log() method': helpers.testLevels(tokenTransport, 'should log messages to loggly', function ( + ign, + err, + logged) { assert.isNull(err); assert.isTrue(logged); }) } } -}).export(module); \ No newline at end of file +}).export(module); From c7561ea1a860ce105900cd9d0fbacbb3d1d6cce6 Mon Sep 17 00:00:00 2001 From: Harrison Van Date: Thu, 22 Nov 2018 17:22:43 +0800 Subject: [PATCH 2/4] feat: support full logs --- lib/winston-loggly.js | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/lib/winston-loggly.js b/lib/winston-loggly.js index 6175447..1e27154 100755 --- a/lib/winston-loggly.js +++ b/lib/winston-loggly.js @@ -98,11 +98,19 @@ Loggly.prototype.name = 'loggly'; const validateMetadata = (meta) => { if (meta == null) { return {}; - } else if (typeof meta !== 'object') { + } + + if (typeof meta !== 'object') { return { metadata: meta }; - } else { - return clone(meta); } + + const symbols = Object.getOwnPropertySymbols(meta); + const key = symbols.find(symbol => String(symbol) === 'Symbol(message)'); + if (key !== undefined) { + return clone(meta[key]); + } + + return clone(meta); }; // @@ -115,14 +123,14 @@ const validateMetadata = (meta) => { // Loggly.prototype.log = function (level, msg, meta, callback) { - const message = validateMetadata(meta); + const data = validateMetadata(meta); if (this.silent) { return callback(null, true); } - if (this.timestamp && !message.timestamp) { - message.timestamp = (new Date()).toISOString(); + if (this.timestamp && !data.timestamp) { + data.timestamp = (new Date()).toISOString(); } if (this.stripColors) { @@ -131,8 +139,8 @@ Loggly.prototype.log = function (level, msg, meta, callback) { const self = this; - message.level = level; - message.message = msg || message.message; + data.level = level; + data.message = msg || data.message; // // Helper function for responded to logging. @@ -143,8 +151,8 @@ Loggly.prototype.log = function (level, msg, meta, callback) { } return (meta && meta.tags) - ? this.client.log(message, meta.tags, logged) - : this.client.log(message, logged); + ? this.client.log(data, meta.tags, logged) + : this.client.log(data, logged); }; // From 6ec6c0da20b99672ecaff044c4f33819ffd9deee Mon Sep 17 00:00:00 2001 From: Harrison Van Date: Thu, 22 Nov 2018 18:01:39 +0800 Subject: [PATCH 3/4] chore: clean up --- package-lock.json | 18 +++++++++++++----- package.json | 3 +-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5901ed9..d883528 100644 --- a/package-lock.json +++ b/package-lock.json @@ -334,7 +334,8 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "is-arrayish": { "version": "0.3.2", @@ -356,7 +357,8 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isstream": { "version": "0.1.2", @@ -499,7 +501,8 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true }, "psl": { "version": "1.1.29", @@ -520,6 +523,7 @@ "version": "2.3.6", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -602,6 +606,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -631,7 +636,8 @@ "triple-beam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==", + "dev": true }, "tunnel-agent": { "version": "0.6.0", @@ -657,7 +663,8 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "uuid": { "version": "3.3.2", @@ -706,6 +713,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.2.0.tgz", "integrity": "sha512-0R1bvFqxSlK/ZKTH86nymOuKv/cT1PQBMuDdA7k7f0S9fM44dNH6bXnuxwXPrN8lefJgtZq08BKdyZ0DZIy/rg==", + "dev": true, "requires": { "readable-stream": "^2.3.6", "triple-beam": "^1.2.0" diff --git a/package.json b/package.json index 6cbbb33..8087fa5 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,7 @@ ], "dependencies": { "clone": "2.1.2", - "node-loggly-bulk": "2.2.4", - "winston-transport": "4.2.0" + "node-loggly-bulk": "2.2.4" }, "devDependencies": { "vows": "0.8.2", From 632d437c1ce2824baca5f973fe17a95feb485e89 Mon Sep 17 00:00:00 2001 From: Harrison Van Date: Thu, 22 Nov 2018 18:29:01 +0800 Subject: [PATCH 4/4] feature: new transport (#2) * feat: new log api * chore: small changes * chore: small changes --- lib/winston-loggly.js | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/lib/winston-loggly.js b/lib/winston-loggly.js index 1e27154..433d112 100755 --- a/lib/winston-loggly.js +++ b/lib/winston-loggly.js @@ -114,16 +114,14 @@ const validateMetadata = (meta) => { }; // -// ### function log (level, msg, [meta], callback) -// #### @level {string} Level at which to log the message. -// #### @msg {string} Message to log -// #### @meta {Object} **Optional** Additional metadata to attach +// ### function log (metadata, callback) +// #### @metadata {Object} Information to attach. // #### @callback {function} Continuation to respond to when complete. -// Core logging method exposed to Winston. Metadata is optional. +// Core logging method exposed to Winston. // -Loggly.prototype.log = function (level, msg, meta, callback) { +Loggly.prototype.log = function (metadata, callback) { - const data = validateMetadata(meta); + const data = validateMetadata(metadata); if (this.silent) { return callback(null, true); @@ -134,14 +132,11 @@ Loggly.prototype.log = function (level, msg, meta, callback) { } if (this.stripColors) { - msg = ('' + msg).replace(code, ''); + data.message = ('' + data.message).replace(code, ''); } const self = this; - data.level = level; - data.message = msg || data.message; - // // Helper function for responded to logging. // @@ -150,8 +145,8 @@ Loggly.prototype.log = function (level, msg, meta, callback) { callback(err, true); } - return (meta && meta.tags) - ? this.client.log(data, meta.tags, logged) + return (data && data.tags) + ? this.client.log(data, data.tags, logged) : this.client.log(data, logged); };