Skip to content

Commit

Permalink
Fix Issue where winston removes transport on error (#1662)
Browse files Browse the repository at this point in the history
  • Loading branch information
yinzara committed Oct 5, 2019
1 parent ae2335b commit 15ba0c1
Show file tree
Hide file tree
Showing 2 changed files with 124 additions and 0 deletions.
6 changes: 6 additions & 0 deletions lib/winston/logger.js
Original file line number Diff line number Diff line change
Expand Up @@ -622,6 +622,12 @@ class Logger extends Transform {
*/
_onEvent(event, transport) {
function transportEvent(err) {
// https://github.com/winstonjs/winston/issues/1364
if (event === 'error') {
if (!this.transports.includes(transport)) {
this.add(transport);
}
}
this.emit(event, err, transport);
}

Expand Down
118 changes: 118 additions & 0 deletions test/transports/error.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
const winston = require('../../lib/winston');
const assume = require('assume');

// https://github.com/winstonjs/winston/issues/1364
describe('transports issue 1364', () => {
const mainError = 'Error logging!';
const otherError = 'Other error';
let logger;
let errorMessage;
let counter;
let maxCounter;
let logError;
let transport;
const newTransport = () =>
Object.assign(new winston.transports.Console(), {
log: (info, next) => {
if (counter === maxCounter) {
next(new Error(errorMessage));
return;
}
if (logError !== null) {
errorMessage = otherError;
}
counter = counter + 1;
next();
return;
}
});
beforeEach(() => {
errorMessage = mainError;
counter = 0;
maxCounter = 1;
logError = null;
transport = newTransport();
logger = winston.createLogger({
level: 'info',
transports: [transport]
});
logger.on('error', error => {
counter = 0;
logError = error;
});
});

describe('only log once', () => {
beforeEach(() => {
logger.info('log once');
});

it('logger transport has single correct transport', () => {
const transports = logger.transports;
assume(transports).is.an('array');
assume(transports).length(1);
assume(transports).contains(transport);
});

it("error didn't", () => {
assume(logError).not.exists();
});
});

describe('log twice', () => {
beforeEach(() => {
logger.info('log twice 1');
logger.info('log twice 2'); // this raises the `mainError` for the transport
});

it('logger transport has single correct transport', () => {
const transports = logger.transports;
assume(transports).is.an('array');
assume(transports).length(1);
assume(transports).contains(transport);
});

it('error occurred', () => {
assume(logError).property('message', mainError);
});
});

describe('log thrice', () => {
beforeEach(() => {
logger.info('log thrice 1');
logger.info('log thrice 2'); // this raises the `mainError` for the transport
logger.info('log thrice 3');
});

it('logger transport has single correct transport', () => {
const transports = logger.transports;
assume(transports).is.an('array');
assume(transports).length(1);
assume(transports).contains(transport);
});

it('error occurred', () => {
assume(logError).property('message', mainError);
});
});

describe('log four times', () => {
beforeEach(() => {
logger.info('log four times 1');
logger.info('log four times 2'); // this raises the `mainError` for the transport
logger.info('log four times 3');
logger.info('log four times 4'); // this raises the `otherError` for the transport
});

it('logger transport has single correct transport', () => {
const transports = logger.transports;
assume(transports).is.an('array');
assume(transports).length(1);
assume(transports).contains(transport);
});

it('other error occurred', () => {
assume(logError).property('message', otherError);
});
});
});

0 comments on commit 15ba0c1

Please sign in to comment.