diff --git a/README.md b/README.md index 71426c598ff25841594b4ed8cf3860b737796650..7e2fcbc579df64dbcb6ad90f0836b57f23aeb72d 100755 --- a/README.md +++ b/README.md @@ -29,10 +29,22 @@ e.g.: `log.info('this', ['array', 8], 4, {type:'test'})` -will logged as +will logged as (with default format) __YYYY-MM-DDTHH:ii:ss SERVER INFO this ["array",8] 4 {"type": "test"} +### Formatting + +You can edit the output using the __format__-Option. + +Possible Setting: + +- __{timestamp}__: Display the timestamp in ISO format +- __{hostname}__: Display the hostname +- __{name}__: Display the Application name +- __{loglevel}__: Display the Loglevel +- __{message}__: Display the Message + ### Options ```json @@ -43,6 +55,7 @@ __YYYY-MM-DDTHH:ii:ss SERVER INFO this ["array",8] 4 {"type": "test"} "path": "Path Logfile located", "loglevel": "Minimal LogLevel. Default: WARN", "delimeter": "How to join multiple outputs. Default: (a single space)", + "format": "Format the output. Default: {timestamp}\\t{hostname}\\t{loglevel}\\t{message}", "graylog": { "active": "true or false", "mode": "http or udp, defaults to udp", diff --git a/examples/formatting.js b/examples/formatting.js new file mode 100755 index 0000000000000000000000000000000000000000..27b20d465246b2b04c8b1b0ba3cd6ed6f5d2bf9c --- /dev/null +++ b/examples/formatting.js @@ -0,0 +1,29 @@ +const Log = require('../index.js') + +let log = new Log({ + name: 'Sample-Application', + hostname: 'test-server', + loglevel: 'INFO' +}) + +log.info('This is an Information in default formatting') + +log = new Log({ + name: 'Sample-Application', + hostname: 'test-server', + loglevel: 'INFO', + format: '{message}' +}) +console.log() +console.log('---- Message Only ----') +log.info('Only the message') + +log = new Log({ + name: 'Sample-Application', + hostname: 'test-server', + loglevel: 'INFO', + format: '{"timestamp":"{timestamp}", "level":"{loglevel}", "message":"{message}"}' +}) +console.log() +console.log('---- As JSON ----') +log.info('JSON Output') diff --git a/index.js b/index.js index aec90c9c18746f57451578e9b68b0727bc8c7343..850df8e88932c238f143ffd008d7c4d82fc6f0fe 100755 --- a/index.js +++ b/index.js @@ -13,6 +13,11 @@ function Log (options) { } else { this.loglevel = 2 } + if (this.options.format) { + this.format = this.options.format + } else { + this.format = '{timestamp}\t{hostname}\t{name}\t{loglevel}\t{message}' + } if (this.options.delimeter) { this.delimeter = this.options.delimeter } else { @@ -109,9 +114,13 @@ function Log (options) { } else { msgString = this.objectToString(message[0]) } - + let msg = this.format + msg = msg.replace('{timestamp}', this.getDate()) + msg = msg.replace('{hostname}', this.hostname) + msg = msg.replace('{name}', this.name) + msg = msg.replace('{loglevel}', tag) + msg = msg.replace('{message}', msgString) - let msg = this.getDate() + '\t' + this.hostname + '\t' + this.name + '\t' + tag + '\t' + msgString switch (tag) { case 'INFO': console.info(msg) diff --git a/index.test.js b/index.test.js index 588a2a1ff66000f75d757a8b570d2b0d664c7016..7fe7c2bc611dc21a313344cc75992cfa00fc5c48 100755 --- a/index.test.js +++ b/index.test.js @@ -27,6 +27,7 @@ describe('@general/log', () => { expect(log.delimeter).toBe(' ') expect(log.name).toBe('@general/log') expect(log.hostname).toBe(hostname) + expect(log.format).toBe('{timestamp}\t{hostname}\t{name}\t{loglevel}\t{message}') }) it('should use option hostname', () => { let log = new LOG({ @@ -36,6 +37,7 @@ describe('@general/log', () => { expect(log.delimeter).toBe(' ') expect(log.name).toBe('@general/log') expect(log.hostname).toBe('test') + expect(log.format).toBe('{timestamp}\t{hostname}\t{name}\t{loglevel}\t{message}') }) it('should use option name', () => { let log = new LOG({ @@ -45,6 +47,7 @@ describe('@general/log', () => { expect(log.delimeter).toBe(' ') expect(log.name).toBe('test') expect(log.hostname).toBe(hostname) + expect(log.format).toBe('{timestamp}\t{hostname}\t{name}\t{loglevel}\t{message}') }) it('should use option delimeter', () => { let log = new LOG({ @@ -54,6 +57,7 @@ describe('@general/log', () => { expect(log.delimeter).toBe(';') expect(log.name).toBe('@general/log') expect(log.hostname).toBe(hostname) + expect(log.format).toBe('{timestamp}\t{hostname}\t{name}\t{loglevel}\t{message}') }) it('should use option loglevel', () => { let log = new LOG({ @@ -63,10 +67,19 @@ describe('@general/log', () => { expect(log.delimeter).toBe(' ') expect(log.name).toBe('@general/log') expect(log.hostname).toBe(hostname) + expect(log.format).toBe('{timestamp}\t{hostname}\t{name}\t{loglevel}\t{message}') + }) + it('should use option format', () => { + let log = new LOG({ + format: '{message}' + }); + expect(log.loglevel).toBe(2) + expect(log.delimeter).toBe(' ') + expect(log.name).toBe('@general/log') + expect(log.hostname).toBe(hostname) + expect(log.format).toBe('{message}') }) it.todo('should use option graylog') - it.todo('should use option file') - it.todo('should use option path') }) describe('log by level', () => { it('should log fatal only if level is appropriate', () => { @@ -270,6 +283,62 @@ describe('@general/log', () => { expect(logged).toBe(expected) }) }) + describe('log formatting', () => { + it('should log message only if set', () => { + let log = new LOG({ + format: '{message}', + loglevel: 'DEBUG' + }); + let logged = log.debug('test') + let expected = 'test' + expect(logged).toBe(expected) + }) + it('should log hostname only if set', () => { + let log = new LOG({ + format: '{hostname}', + loglevel: 'DEBUG' + }); + let logged = log.debug('test') + let expected = hostname + expect(logged).toBe(expected) + }) + it('should log name only if set', () => { + let log = new LOG({ + format: '{name}', + loglevel: 'DEBUG' + }); + let logged = log.debug('test') + let expected = '@general/log' + expect(logged).toBe(expected) + }) + it('should log timestamp only if set', () => { + let log = new LOG({ + format: '{timestamp}', + loglevel: 'DEBUG' + }); + let logged = log.debug('test') + let expected = getDate() + expect(logged).toBe(expected) + }) + it('should log loglevel only if set', () => { + let log = new LOG({ + format: '{loglevel}', + loglevel: 'DEBUG' + }); + let logged = log.debug('test') + let expected = 'DEBUG' + expect(logged).toBe(expected) + }) + it('should log json like message if set', () => { + let log = new LOG({ + format: '{"timestamp":"{timestamp}", "level":"{loglevel}", "message":"{message}"}', + loglevel: 'DEBUG' + }); + let logged = log.debug('test') + let expected = '{"timestamp":"' + getDate() + '", "level":"DEBUG", "message":"test"}' + expect(logged).toBe(expected) + }) + }) describe('log to file', () => { it('should create the folder if not exists', () => { let logPath = os.tmpdir() + '/log-test' + Math.floor(Math.random() * 1000) @@ -312,7 +381,6 @@ describe('@general/log', () => { it.todo('should log to graylog via udp') it.todo('should log to graylog via http') }) - // TODO: formatting // TODO: log to loki // TODO: add mutation test })