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.
		
		
		
		
		
			
		
			
				
					239 lines
				
				6.6 KiB
			
		
		
			
		
	
	
					239 lines
				
				6.6 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | /* eslint no-prototype-builtins: 0 */ | ||
|  | const os = require('os') | ||
|  | const stdSerializers = require('pino-std-serializers') | ||
|  | const redaction = require('./lib/redaction') | ||
|  | const time = require('./lib/time') | ||
|  | const proto = require('./lib/proto') | ||
|  | const symbols = require('./lib/symbols') | ||
|  | const { assertDefaultLevelFound, mappings, genLsCache } = require('./lib/levels') | ||
|  | const { | ||
|  |   createArgsNormalizer, | ||
|  |   asChindings, | ||
|  |   final, | ||
|  |   stringify, | ||
|  |   buildSafeSonicBoom, | ||
|  |   buildFormatters, | ||
|  |   noop | ||
|  | } = require('./lib/tools') | ||
|  | const { version } = require('./lib/meta') | ||
|  | const { mixinMergeStrategySym } = require('./lib/symbols') | ||
|  | const { | ||
|  |   chindingsSym, | ||
|  |   redactFmtSym, | ||
|  |   serializersSym, | ||
|  |   timeSym, | ||
|  |   timeSliceIndexSym, | ||
|  |   streamSym, | ||
|  |   stringifySym, | ||
|  |   stringifiersSym, | ||
|  |   setLevelSym, | ||
|  |   endSym, | ||
|  |   formatOptsSym, | ||
|  |   messageKeySym, | ||
|  |   nestedKeySym, | ||
|  |   mixinSym, | ||
|  |   useOnlyCustomLevelsSym, | ||
|  |   formattersSym, | ||
|  |   hooksSym | ||
|  | } = symbols | ||
|  | const { epochTime, nullTime } = time | ||
|  | const { pid } = process | ||
|  | const hostname = os.hostname() | ||
|  | const defaultErrorSerializer = stdSerializers.err | ||
|  | const defaultOptions = { | ||
|  |   level: 'info', | ||
|  |   messageKey: 'msg', | ||
|  |   nestedKey: null, | ||
|  |   enabled: true, | ||
|  |   prettyPrint: false, | ||
|  |   base: { pid, hostname }, | ||
|  |   serializers: Object.assign(Object.create(null), { | ||
|  |     err: defaultErrorSerializer | ||
|  |   }), | ||
|  |   formatters: Object.assign(Object.create(null), { | ||
|  |     bindings (bindings) { | ||
|  |       return bindings | ||
|  |     }, | ||
|  |     level (label, number) { | ||
|  |       return { level: number } | ||
|  |     } | ||
|  |   }), | ||
|  |   hooks: { | ||
|  |     logMethod: undefined | ||
|  |   }, | ||
|  |   timestamp: epochTime, | ||
|  |   name: undefined, | ||
|  |   redact: null, | ||
|  |   customLevels: null, | ||
|  |   levelKey: undefined, | ||
|  |   useOnlyCustomLevels: false | ||
|  | } | ||
|  | 
 | ||
|  | const normalize = createArgsNormalizer(defaultOptions) | ||
|  | 
 | ||
|  | const serializers = Object.assign(Object.create(null), stdSerializers) | ||
|  | 
 | ||
|  | function pino (...args) { | ||
|  |   const instance = {} | ||
|  |   const { opts, stream } = normalize(instance, ...args) | ||
|  |   const { | ||
|  |     redact, | ||
|  |     crlf, | ||
|  |     serializers, | ||
|  |     timestamp, | ||
|  |     messageKey, | ||
|  |     nestedKey, | ||
|  |     base, | ||
|  |     name, | ||
|  |     level, | ||
|  |     customLevels, | ||
|  |     useLevelLabels, | ||
|  |     changeLevelName, | ||
|  |     levelKey, | ||
|  |     mixin, | ||
|  |     mixinMergeStrategy, | ||
|  |     useOnlyCustomLevels, | ||
|  |     formatters, | ||
|  |     hooks | ||
|  |   } = opts | ||
|  | 
 | ||
|  |   const allFormatters = buildFormatters( | ||
|  |     formatters.level, | ||
|  |     formatters.bindings, | ||
|  |     formatters.log | ||
|  |   ) | ||
|  | 
 | ||
|  |   if (useLevelLabels && !(changeLevelName || levelKey)) { | ||
|  |     process.emitWarning('useLevelLabels is deprecated, use the formatters.level option instead', 'Warning', 'PINODEP001') | ||
|  |     allFormatters.level = labelsFormatter | ||
|  |   } else if ((changeLevelName || levelKey) && !useLevelLabels) { | ||
|  |     process.emitWarning('changeLevelName and levelKey are deprecated, use the formatters.level option instead', 'Warning', 'PINODEP002') | ||
|  |     allFormatters.level = levelNameFormatter(changeLevelName || levelKey) | ||
|  |   } else if ((changeLevelName || levelKey) && useLevelLabels) { | ||
|  |     process.emitWarning('useLevelLabels is deprecated, use the formatters.level option instead', 'Warning', 'PINODEP001') | ||
|  |     process.emitWarning('changeLevelName and levelKey are deprecated, use the formatters.level option instead', 'Warning', 'PINODEP002') | ||
|  |     allFormatters.level = levelNameLabelFormatter(changeLevelName || levelKey) | ||
|  |   } | ||
|  | 
 | ||
|  |   if (serializers[Symbol.for('pino.*')]) { | ||
|  |     process.emitWarning('The pino.* serializer is deprecated, use the formatters.log options instead', 'Warning', 'PINODEP003') | ||
|  |     allFormatters.log = serializers[Symbol.for('pino.*')] | ||
|  |   } | ||
|  | 
 | ||
|  |   if (!allFormatters.bindings) { | ||
|  |     allFormatters.bindings = defaultOptions.formatters.bindings | ||
|  |   } | ||
|  |   if (!allFormatters.level) { | ||
|  |     allFormatters.level = defaultOptions.formatters.level | ||
|  |   } | ||
|  | 
 | ||
|  |   const stringifiers = redact ? redaction(redact, stringify) : {} | ||
|  |   const formatOpts = redact | ||
|  |     ? { stringify: stringifiers[redactFmtSym] } | ||
|  |     : { stringify } | ||
|  |   const end = '}' + (crlf ? '\r\n' : '\n') | ||
|  |   const coreChindings = asChindings.bind(null, { | ||
|  |     [chindingsSym]: '', | ||
|  |     [serializersSym]: serializers, | ||
|  |     [stringifiersSym]: stringifiers, | ||
|  |     [stringifySym]: stringify, | ||
|  |     [formattersSym]: allFormatters | ||
|  |   }) | ||
|  | 
 | ||
|  |   let chindings = '' | ||
|  |   if (base !== null) { | ||
|  |     if (name === undefined) { | ||
|  |       chindings = coreChindings(base) | ||
|  |     } else { | ||
|  |       chindings = coreChindings(Object.assign({}, base, { name })) | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   const time = (timestamp instanceof Function) | ||
|  |     ? timestamp | ||
|  |     : (timestamp ? epochTime : nullTime) | ||
|  |   const timeSliceIndex = time().indexOf(':') + 1 | ||
|  | 
 | ||
|  |   if (useOnlyCustomLevels && !customLevels) throw Error('customLevels is required if useOnlyCustomLevels is set true') | ||
|  |   if (mixin && typeof mixin !== 'function') throw Error(`Unknown mixin type "${typeof mixin}" - expected "function"`) | ||
|  | 
 | ||
|  |   assertDefaultLevelFound(level, customLevels, useOnlyCustomLevels) | ||
|  |   const levels = mappings(customLevels, useOnlyCustomLevels) | ||
|  | 
 | ||
|  |   Object.assign(instance, { | ||
|  |     levels, | ||
|  |     [useOnlyCustomLevelsSym]: useOnlyCustomLevels, | ||
|  |     [streamSym]: stream, | ||
|  |     [timeSym]: time, | ||
|  |     [timeSliceIndexSym]: timeSliceIndex, | ||
|  |     [stringifySym]: stringify, | ||
|  |     [stringifiersSym]: stringifiers, | ||
|  |     [endSym]: end, | ||
|  |     [formatOptsSym]: formatOpts, | ||
|  |     [messageKeySym]: messageKey, | ||
|  |     [nestedKeySym]: nestedKey, | ||
|  |     [serializersSym]: serializers, | ||
|  |     [mixinSym]: mixin, | ||
|  |     [mixinMergeStrategySym]: mixinMergeStrategy, | ||
|  |     [chindingsSym]: chindings, | ||
|  |     [formattersSym]: allFormatters, | ||
|  |     [hooksSym]: hooks, | ||
|  |     silent: noop | ||
|  |   }) | ||
|  | 
 | ||
|  |   Object.setPrototypeOf(instance, proto()) | ||
|  | 
 | ||
|  |   genLsCache(instance) | ||
|  | 
 | ||
|  |   instance[setLevelSym](level) | ||
|  | 
 | ||
|  |   return instance | ||
|  | } | ||
|  | 
 | ||
|  | function labelsFormatter (label, number) { | ||
|  |   return { level: label } | ||
|  | } | ||
|  | 
 | ||
|  | function levelNameFormatter (name) { | ||
|  |   return function (label, number) { | ||
|  |     return { [name]: number } | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | function levelNameLabelFormatter (name) { | ||
|  |   return function (label, number) { | ||
|  |     return { [name]: label } | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = pino | ||
|  | 
 | ||
|  | module.exports.extreme = (dest = process.stdout.fd) => { | ||
|  |   process.emitWarning( | ||
|  |     'The pino.extreme() option is deprecated and will be removed in v7. Use pino.destination({ sync: false }) instead.', | ||
|  |     { code: 'extreme_deprecation' } | ||
|  |   ) | ||
|  |   return buildSafeSonicBoom({ dest, minLength: 4096, sync: false }) | ||
|  | } | ||
|  | 
 | ||
|  | module.exports.destination = (dest = process.stdout.fd) => { | ||
|  |   if (typeof dest === 'object') { | ||
|  |     dest.dest = dest.dest || process.stdout.fd | ||
|  |     return buildSafeSonicBoom(dest) | ||
|  |   } else { | ||
|  |     return buildSafeSonicBoom({ dest, minLength: 0, sync: true }) | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | module.exports.final = final | ||
|  | module.exports.levels = mappings() | ||
|  | module.exports.stdSerializers = serializers | ||
|  | module.exports.stdTimeFunctions = Object.assign({}, time) | ||
|  | module.exports.symbols = symbols | ||
|  | module.exports.version = version | ||
|  | 
 | ||
|  | // Enables default and name export with TypeScript and Babel
 | ||
|  | module.exports.default = pino | ||
|  | module.exports.pino = pino |