123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- "use strict";
- var vows = require('vows')
- , assert = require('assert')
- , sandbox = require('sandboxed-module')
- , log4js = require('../lib/log4js')
- , realLayouts = require('../lib/layouts')
- , setupLogging = function(options, category, compressedLength) {
- var fakeDgram = {
- sent: false,
- socket: {
- packetLength: 0,
- closed: false,
- close: function() {
- this.closed = true;
- },
- send: function(pkt, offset, pktLength, port, host) {
- fakeDgram.sent = true;
- this.packet = pkt;
- this.offset = offset;
- this.packetLength = pktLength;
- this.port = port;
- this.host = host;
- }
- },
- createSocket: function(type) {
- this.type = type;
- return this.socket;
- }
- }
- , fakeZlib = {
- gzip: function(objectToCompress, callback) {
- fakeZlib.uncompressed = objectToCompress;
- if (this.shouldError) {
- callback({ stack: "oh noes" });
- return;
- }
- if (compressedLength) {
- callback(null, { length: compressedLength });
- } else {
- callback(null, "I've been compressed");
- }
- }
- }
- , exitHandler
- , fakeConsole = {
- error: function(message) {
- this.message = message;
- }
- }
- , fakeLayouts = {
- layout: function(type, options) {
- this.type = type;
- this.options = options;
- return realLayouts.messagePassThroughLayout;
- },
- messagePassThroughLayout: realLayouts.messagePassThroughLayout
- }
- , appender = sandbox.require('../lib/appenders/gelf', {
- requires: {
- dgram: fakeDgram,
- zlib: fakeZlib,
- '../layouts': fakeLayouts
- },
- globals: {
- process: {
- on: function(evt, handler) {
- if (evt === 'exit') {
- exitHandler = handler;
- }
- }
- },
- console: fakeConsole
- }
- });
-
- log4js.clearAppenders();
- log4js.addAppender(appender.configure(options || {}), category || "gelf-test");
- return {
- dgram: fakeDgram,
- compress: fakeZlib,
- exitHandler: exitHandler,
- console: fakeConsole,
- layouts: fakeLayouts,
- logger: log4js.getLogger(category || "gelf-test")
- };
- };
- vows.describe('log4js gelfAppender').addBatch({
-
- 'with default gelfAppender settings': {
- topic: function() {
- var setup = setupLogging();
- setup.logger.info("This is a test");
- return setup;
- },
- 'the dgram packet': {
- topic: function(setup) {
- return setup.dgram;
- },
- 'should be sent via udp to the localhost gelf server': function(dgram) {
- assert.equal(dgram.type, "udp4");
- assert.equal(dgram.socket.host, "localhost");
- assert.equal(dgram.socket.port, 12201);
- assert.equal(dgram.socket.offset, 0);
- assert.ok(dgram.socket.packetLength > 0, "Received blank message");
- },
- 'should be compressed': function(dgram) {
- assert.equal(dgram.socket.packet, "I've been compressed");
- }
- },
- 'the uncompressed log message': {
- topic: function(setup) {
- var message = JSON.parse(setup.compress.uncompressed);
- return message;
- },
- 'should be in the gelf format': function(message) {
- assert.equal(message.version, '1.0');
- assert.equal(message.host, require('os').hostname());
- assert.equal(message.level, 6); //INFO
- assert.equal(message.facility, 'nodejs-server');
- assert.equal(message.full_message, message.short_message);
- assert.equal(message.full_message, 'This is a test');
- }
- }
- },
- 'with a message longer than 8k': {
- topic: function() {
- var setup = setupLogging(undefined, undefined, 10240);
- setup.logger.info("Blah.");
- return setup;
- },
- 'the dgram packet': {
- topic: function(setup) {
- return setup.dgram;
- },
- 'should not be sent': function(dgram) {
- assert.equal(dgram.sent, false);
- }
- }
- },
- 'with non-default options': {
- topic: function() {
- var setup = setupLogging({
- host: 'somewhere',
- port: 12345,
- hostname: 'cheese',
- facility: 'nonsense'
- });
- setup.logger.debug("Just testing.");
- return setup;
- },
- 'the dgram packet': {
- topic: function(setup) {
- return setup.dgram;
- },
- 'should pick up the options': function(dgram) {
- assert.equal(dgram.socket.host, 'somewhere');
- assert.equal(dgram.socket.port, 12345);
- }
- },
- 'the uncompressed packet': {
- topic: function(setup) {
- var message = JSON.parse(setup.compress.uncompressed);
- return message;
- },
- 'should pick up the options': function(message) {
- assert.equal(message.host, 'cheese');
- assert.equal(message.facility, 'nonsense');
- }
- }
- },
- 'on process.exit': {
- topic: function() {
- var setup = setupLogging();
- setup.exitHandler();
- return setup;
- },
- 'should close open sockets': function(setup) {
- assert.isTrue(setup.dgram.socket.closed);
- }
- },
- 'on zlib error': {
- topic: function() {
- var setup = setupLogging();
- setup.compress.shouldError = true;
- setup.logger.info('whatever');
- return setup;
- },
- 'should output to console.error': function(setup) {
- assert.equal(setup.console.message, 'oh noes');
- }
- },
- 'with layout in configuration': {
- topic: function() {
- var setup = setupLogging({
- layout: {
- type: 'madeuplayout',
- earlgrey: 'yes, please'
- }
- });
- return setup;
- },
- 'should pass options to layout': function(setup) {
- assert.equal(setup.layouts.type, 'madeuplayout');
- assert.equal(setup.layouts.options.earlgrey, 'yes, please');
- }
- },
- 'with custom fields options': {
- topic: function() {
- var setup = setupLogging({
- host: 'somewhere',
- port: 12345,
- hostname: 'cheese',
- facility: 'nonsense',
- customFields: {
- _every1: 'Hello every one',
- _every2: 'Hello every two'
- }
- });
- var myFields = {
- GELF: true,
- _every2: 'Overwritten!',
- _myField: 'This is my field!'
- };
- setup.logger.debug(myFields, "Just testing.");
- return setup;
- },
- 'the dgram packet': {
- topic: function(setup) {
- return setup.dgram;
- },
- 'should pick up the options': function(dgram) {
- assert.equal(dgram.socket.host, 'somewhere');
- assert.equal(dgram.socket.port, 12345);
- }
- },
- 'the uncompressed packet': {
- topic: function(setup) {
- var message = JSON.parse(setup.compress.uncompressed);
- return message;
- },
- 'should pick up the options': function(message) {
- assert.equal(message.host, 'cheese');
- assert.equal(message.facility, 'nonsense');
- assert.equal(message._every1, 'Hello every one'); // the default value
- assert.equal(message._every2, 'Overwritten!'); // the overwritten value
- assert.equal(message._myField, 'This is my field!'); // the value for this message only
- assert.equal(message.short_message, 'Just testing.'); // skip the field object
- assert.equal(message.full_message, 'Just testing.'); // should be as same as short_message
- }
- }
- }
- }).export(module);
|