From dffd68b65280043f7d625b99dbaeef1eebde0255 Mon Sep 17 00:00:00 2001 From: Kevin Goerlitz Date: Wed, 28 Jan 2015 10:21:43 -0600 Subject: [PATCH 1/3] Add support for close() method to allow for clean shutdown --- lib/winston-logstash.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/winston-logstash.js b/lib/winston-logstash.js index 99afa40..9146a62 100644 --- a/lib/winston-logstash.js +++ b/lib/winston-logstash.js @@ -180,6 +180,9 @@ Logstash.prototype.connect = function () { this.socket.on('close', function (had_error) { self.connected = false; + if (self.terminating) { + return; + } if (self.max_connect_retries < 0 || self.retries < self.max_connect_retries) { if (!self.connecting) { @@ -203,10 +206,24 @@ Logstash.prototype.connect = function () { }; +Logstash.prototype.close = function () { + var self = this; + self.terminating = true; + if (self.connected && self.socket) { + self.connected = false; + self.socket.end(); + self.socket.destroy(); + self.socket = null; + } +}; + Logstash.prototype.announce = function () { var self = this; self.connected = true; self.flush(); + if (self.terminating) { + self.close(); + } }; Logstash.prototype.flush = function () { From bfc2e092067341a48e40318e7f9bcf4d07671677 Mon Sep 17 00:00:00 2001 From: Kevin Goerlitz Date: Wed, 28 Jan 2015 13:25:57 -0600 Subject: [PATCH 2/3] Update tests and fix issues. --- lib/winston-logstash.js | 22 +++++++-------- test/winston-logstash_test.js | 50 +++++++++++++++++------------------ 2 files changed, 34 insertions(+), 38 deletions(-) diff --git a/lib/winston-logstash.js b/lib/winston-logstash.js index 9146a62..4f99d3b 100644 --- a/lib/winston-logstash.js +++ b/lib/winston-logstash.js @@ -128,6 +128,7 @@ Logstash.prototype.connect = function () { var self = this; this.retries++; this.connecting = true; + this.terminating = false; if (this.ssl_enable) { options = { key: this.ssl_key ? fs.readFileSync(this.ssl_key) : null, @@ -180,9 +181,6 @@ Logstash.prototype.connect = function () { this.socket.on('close', function (had_error) { self.connected = false; - if (self.terminating) { - return; - } if (self.max_connect_retries < 0 || self.retries < self.max_connect_retries) { if (!self.connecting) { @@ -207,14 +205,14 @@ Logstash.prototype.connect = function () { }; Logstash.prototype.close = function () { - var self = this; - self.terminating = true; - if (self.connected && self.socket) { - self.connected = false; - self.socket.end(); - self.socket.destroy(); - self.socket = null; - } + var self = this; + self.terminating = true; + if (self.connected && self.socket) { + self.connected = false; + self.socket.end(); + self.socket.destroy(); + self.socket = null; + } }; Logstash.prototype.announce = function () { @@ -222,7 +220,7 @@ Logstash.prototype.announce = function () { self.connected = true; self.flush(); if (self.terminating) { - self.close(); + self.close(); } }; diff --git a/test/winston-logstash_test.js b/test/winston-logstash_test.js index 104d36e..799baec 100644 --- a/test/winston-logstash_test.js +++ b/test/winston-logstash_test.js @@ -79,7 +79,7 @@ describe('winston-logstash transport', function() { } describe('with logstash server', function () { - var test_server, port = 28777; + var test_server, logger, port = 28777; beforeEach(function(done) { timekeeper.freeze(freezed_time); @@ -88,8 +88,8 @@ describe('winston-logstash transport', function() { it('send logs over TCP as valid json', function(done) { var response; - var logger = createLogger(port); - var expected = {"stream":"sample","level":"info","message":"hello world"}; + var expected = {"stream":"sample","level":"info","message":"hello world","label":"test"}; + logger = createLogger(port); test_server = createTestServer(port, function (data) { response = data.toString(); @@ -102,11 +102,11 @@ describe('winston-logstash transport', function() { it('send each log with a new line character', function(done) { var response; - var logger = createLogger(port); + logger = createLogger(port); test_server = createTestServer(port, function (data) { response = data.toString(); - expect(response).to.be.equal('{"stream":"sample","level":"info","message":"hello world"}\n'); + expect(response).to.be.equal('{"stream":"sample","level":"info","message":"hello world","label":"test"}\n'); done(); }); @@ -116,11 +116,11 @@ describe('winston-logstash transport', function() { it('send with different log levels', function(done) { var response; - var logger = createLogger(port); + logger = createLogger(port); test_server = createTestServer(port, function (data) { response = data.toString(); - expect(response).to.be.equal('{"stream":"sample","level":"info","message":"hello world"}\n{"stream":"sample","level":"error","message":"hello world"}\n'); + expect(response).to.be.equal('{"stream":"sample","level":"info","message":"hello world","label":"test"}\n{"stream":"sample","level":"error","message":"hello world","label":"test"}\n'); done(); }); @@ -131,11 +131,11 @@ describe('winston-logstash transport', function() { it('send with overrided meta data', function(done) { var response; - var logger = createLogger(port, false, '', { meta: { default_meta_override: 'foo' } }); + logger = createLogger(port, false, '', { meta: { default_meta_override: 'foo' } }); test_server = createTestServer(port, function (data) { response = data.toString(); - expect(response).to.be.equal('{"default_meta_override":"foo","level":"info","message":"hello world"}\n'); + expect(response).to.be.equal('{"default_meta_override":"foo","level":"info","message":"hello world","label":"test"}\n'); done(); }); @@ -144,17 +144,21 @@ describe('winston-logstash transport', function() { // Teardown afterEach(function () { + if (logger) { + logger.close(); + } if (test_server) { test_server.close(function () {}); } timekeeper.reset(); test_server = null; + logger = null; }); }); describe('with secured logstash server', function() { - var test_server, port = 28777; + var test_server, logger, port = 28777; beforeEach(function(done) { timekeeper.freeze(freezed_time); @@ -163,8 +167,8 @@ describe('winston-logstash transport', function() { it('send logs over SSL secured TCP as valid json', function(done) { var response; - var logger = createLogger(port, true, __dirname + '/support/ssl/server.cert'); - var expected = {"stream":"sample","level":"info","message":"hello world"}; + var expected = {"stream":"sample","level":"info","message":"hello world","label":"test"}; + logger = createLogger(port, true, __dirname + '/support/ssl/server.cert'); test_server = createTestSecureServer(port, {}, function (data) { response = data.toString(); @@ -177,8 +181,8 @@ describe('winston-logstash transport', function() { it('send logs over SSL secured TCP as valid json with SSL verification', function(done) { var response; - var logger = createLogger(port, true, __dirname + '/support/ssl/server.cert'); - var expected = {"stream":"sample","level":"info","message":"hello world"}; + var expected = {"stream":"sample","level":"info","message":"hello world","label":"test"}; + logger = createLogger(port, true, __dirname + '/support/ssl/server.cert'); test_server = createTestSecureServer(port, { verify: true }, function (data) { response = data.toString(); @@ -192,9 +196,9 @@ describe('winston-logstash transport', function() { it('logstash transport receive an error when there is a connection error different from ECONNREFUSED', function(done) { var response, - logger = createLogger(port, true, __dirname + '/support/ssl/server-fail.cert'), - expected = {"stream":"sample","level":"info","message":"hello world"}, + expected = {"stream":"sample","level":"info","message":"hello world","label":"test"}, silence = true; + logger = createLogger(port, true, __dirname + '/support/ssl/server-fail.cert'), test_server = createTestSecureServer(port, { serverKey: __dirname + '/support/ssl/server-fail.key', @@ -219,6 +223,9 @@ describe('winston-logstash transport', function() { // Teardown afterEach(function () { + if (logger) { + logger.close(); + } if (test_server) { test_server.close(function () {}); } @@ -231,20 +238,11 @@ describe('winston-logstash transport', function() { describe('without logstash server', function () { var logger, interval; - var checkSocketStatus = function (retries, logger, done) { - interval = setInterval(function() { - if (logger.transports.logstash.retries == retries) { - clearInterval(interval); - done(); - } - }, 500); - }; - it('fallback to silent mode if logstash server is down', function(done) { var response; var logger = createLogger(28747); - checkSocketStatus (4, logger, function() { + logger.transports.logstash.on('error', function (err) { expect(logger.transports.logstash.silent).to.be.true; done(); }); From 56027e0bb8f6357e4c0bcae47bf6ece816080d28 Mon Sep 17 00:00:00 2001 From: Kevin Goerlitz Date: Wed, 28 Jan 2015 13:59:04 -0600 Subject: [PATCH 3/3] Fix test case. --- test/winston-logstash_test.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/winston-logstash_test.js b/test/winston-logstash_test.js index 799baec..75bd668 100644 --- a/test/winston-logstash_test.js +++ b/test/winston-logstash_test.js @@ -207,7 +207,10 @@ describe('winston-logstash transport', function() { }, function (data) { response = data.toString(); expect(JSON.parse(response)).to.be.eql(expected); - done(); + if (silence) { + done(); + silence = false; + } }); logger.transports.logstash.on('error', function (err) {