You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					302 lines
				
				5.7 KiB
			
		
		
			
		
	
	
					302 lines
				
				5.7 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | /* eslint no-prototype-builtins: 0 */ | ||
|  | 
 | ||
|  | const { hostname } = require('os') | ||
|  | const { test } = require('tap') | ||
|  | const { sink, once } = require('./helper') | ||
|  | const pino = require('../') | ||
|  | 
 | ||
|  | test('level formatter', async ({ match }) => { | ||
|  |   const stream = sink() | ||
|  |   const logger = pino({ | ||
|  |     formatters: { | ||
|  |       level (label, number) { | ||
|  |         return { | ||
|  |           log: { | ||
|  |             level: label | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }, stream) | ||
|  | 
 | ||
|  |   const o = once(stream, 'data') | ||
|  |   logger.info('hello world') | ||
|  |   match(await o, { | ||
|  |     log: { | ||
|  |       level: 'info' | ||
|  |     } | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('bindings formatter', async ({ match }) => { | ||
|  |   const stream = sink() | ||
|  |   const logger = pino({ | ||
|  |     formatters: { | ||
|  |       bindings (bindings) { | ||
|  |         return { | ||
|  |           process: { | ||
|  |             pid: bindings.pid | ||
|  |           }, | ||
|  |           host: { | ||
|  |             name: bindings.hostname | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }, stream) | ||
|  | 
 | ||
|  |   const o = once(stream, 'data') | ||
|  |   logger.info('hello world') | ||
|  |   match(await o, { | ||
|  |     process: { | ||
|  |       pid: process.pid | ||
|  |     }, | ||
|  |     host: { | ||
|  |       name: hostname() | ||
|  |     } | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('no bindings formatter', async ({ match, notOk }) => { | ||
|  |   const stream = sink() | ||
|  |   const logger = pino({ | ||
|  |     formatters: { | ||
|  |       bindings (bindings) { | ||
|  |         return null | ||
|  |       } | ||
|  |     } | ||
|  |   }, stream) | ||
|  | 
 | ||
|  |   const o = once(stream, 'data') | ||
|  |   logger.info('hello world') | ||
|  |   const log = await o | ||
|  |   notOk(log.hasOwnProperty('pid')) | ||
|  |   notOk(log.hasOwnProperty('hostname')) | ||
|  |   match(log, { msg: 'hello world' }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('log formatter', async ({ match, equal }) => { | ||
|  |   const stream = sink() | ||
|  |   const logger = pino({ | ||
|  |     formatters: { | ||
|  |       log (obj) { | ||
|  |         equal(obj.hasOwnProperty('msg'), false) | ||
|  |         return { hello: 'world', ...obj } | ||
|  |       } | ||
|  |     } | ||
|  |   }, stream) | ||
|  | 
 | ||
|  |   const o = once(stream, 'data') | ||
|  |   logger.info({ foo: 'bar', nested: { object: true } }, 'hello world') | ||
|  |   match(await o, { | ||
|  |     hello: 'world', | ||
|  |     foo: 'bar', | ||
|  |     nested: { object: true } | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Formatters combined', async ({ match }) => { | ||
|  |   const stream = sink() | ||
|  |   const logger = pino({ | ||
|  |     formatters: { | ||
|  |       level (label, number) { | ||
|  |         return { | ||
|  |           log: { | ||
|  |             level: label | ||
|  |           } | ||
|  |         } | ||
|  |       }, | ||
|  |       bindings (bindings) { | ||
|  |         return { | ||
|  |           process: { | ||
|  |             pid: bindings.pid | ||
|  |           }, | ||
|  |           host: { | ||
|  |             name: bindings.hostname | ||
|  |           } | ||
|  |         } | ||
|  |       }, | ||
|  |       log (obj) { | ||
|  |         return { hello: 'world', ...obj } | ||
|  |       } | ||
|  |     } | ||
|  |   }, stream) | ||
|  | 
 | ||
|  |   const o = once(stream, 'data') | ||
|  |   logger.info({ foo: 'bar', nested: { object: true } }, 'hello world') | ||
|  |   match(await o, { | ||
|  |     log: { | ||
|  |       level: 'info' | ||
|  |     }, | ||
|  |     process: { | ||
|  |       pid: process.pid | ||
|  |     }, | ||
|  |     host: { | ||
|  |       name: hostname() | ||
|  |     }, | ||
|  |     hello: 'world', | ||
|  |     foo: 'bar', | ||
|  |     nested: { object: true } | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Formatters in child logger', async ({ match }) => { | ||
|  |   const stream = sink() | ||
|  |   const logger = pino({ | ||
|  |     formatters: { | ||
|  |       level (label, number) { | ||
|  |         return { | ||
|  |           log: { | ||
|  |             level: label | ||
|  |           } | ||
|  |         } | ||
|  |       }, | ||
|  |       bindings (bindings) { | ||
|  |         return { | ||
|  |           process: { | ||
|  |             pid: bindings.pid | ||
|  |           }, | ||
|  |           host: { | ||
|  |             name: bindings.hostname | ||
|  |           } | ||
|  |         } | ||
|  |       }, | ||
|  |       log (obj) { | ||
|  |         return { hello: 'world', ...obj } | ||
|  |       } | ||
|  |     } | ||
|  |   }, stream) | ||
|  | 
 | ||
|  |   const child = logger.child({ | ||
|  |     foo: 'bar', | ||
|  |     nested: { object: true } | ||
|  |   }, { | ||
|  |     formatters: { | ||
|  |       bindings (bindings) { | ||
|  |         return { ...bindings, faz: 'baz' } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   const o = once(stream, 'data') | ||
|  |   child.info('hello world') | ||
|  |   match(await o, { | ||
|  |     log: { | ||
|  |       level: 'info' | ||
|  |     }, | ||
|  |     process: { | ||
|  |       pid: process.pid | ||
|  |     }, | ||
|  |     host: { | ||
|  |       name: hostname() | ||
|  |     }, | ||
|  |     hello: 'world', | ||
|  |     foo: 'bar', | ||
|  |     nested: { object: true }, | ||
|  |     faz: 'baz' | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Formatters without bindings in child logger', async ({ match }) => { | ||
|  |   const stream = sink() | ||
|  |   const logger = pino({ | ||
|  |     formatters: { | ||
|  |       level (label, number) { | ||
|  |         return { | ||
|  |           log: { | ||
|  |             level: label | ||
|  |           } | ||
|  |         } | ||
|  |       }, | ||
|  |       bindings (bindings) { | ||
|  |         return { | ||
|  |           process: { | ||
|  |             pid: bindings.pid | ||
|  |           }, | ||
|  |           host: { | ||
|  |             name: bindings.hostname | ||
|  |           } | ||
|  |         } | ||
|  |       }, | ||
|  |       log (obj) { | ||
|  |         return { hello: 'world', ...obj } | ||
|  |       } | ||
|  |     } | ||
|  |   }, stream) | ||
|  | 
 | ||
|  |   const child = logger.child({ | ||
|  |     foo: 'bar', | ||
|  |     nested: { object: true } | ||
|  |   }, { | ||
|  |     formatters: { | ||
|  |       log (obj) { | ||
|  |         return { other: 'stuff', ...obj } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   const o = once(stream, 'data') | ||
|  |   child.info('hello world') | ||
|  |   match(await o, { | ||
|  |     log: { | ||
|  |       level: 'info' | ||
|  |     }, | ||
|  |     process: { | ||
|  |       pid: process.pid | ||
|  |     }, | ||
|  |     host: { | ||
|  |       name: hostname() | ||
|  |     }, | ||
|  |     foo: 'bar', | ||
|  |     other: 'stuff', | ||
|  |     nested: { object: true } | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('elastic common schema format', async ({ match, type }) => { | ||
|  |   const stream = sink() | ||
|  |   const ecs = { | ||
|  |     formatters: { | ||
|  |       level (label, number) { | ||
|  |         return { | ||
|  |           log: { | ||
|  |             level: label, | ||
|  |             logger: 'pino' | ||
|  |           } | ||
|  |         } | ||
|  |       }, | ||
|  |       bindings (bindings) { | ||
|  |         return { | ||
|  |           process: { | ||
|  |             pid: bindings.pid | ||
|  |           }, | ||
|  |           host: { | ||
|  |             name: bindings.hostname | ||
|  |           } | ||
|  |         } | ||
|  |       }, | ||
|  |       log (obj) { | ||
|  |         return { ecs: { version: '1.4.0' }, ...obj } | ||
|  |       } | ||
|  |     }, | ||
|  |     messageKey: 'message', | ||
|  |     timestamp: () => `,"@timestamp":"${new Date(Date.now()).toISOString()}"` | ||
|  |   } | ||
|  | 
 | ||
|  |   const logger = pino({ ...ecs }, stream) | ||
|  | 
 | ||
|  |   const o = once(stream, 'data') | ||
|  |   logger.info({ foo: 'bar' }, 'hello world') | ||
|  |   const log = await o | ||
|  |   type(log['@timestamp'], 'string') | ||
|  |   match(log, { | ||
|  |     log: { level: 'info', logger: 'pino' }, | ||
|  |     process: { pid: process.pid }, | ||
|  |     host: { name: hostname() }, | ||
|  |     ecs: { version: '1.4.0' }, | ||
|  |     foo: 'bar', | ||
|  |     message: 'hello world' | ||
|  |   }) | ||
|  | }) |