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
						
					
					
				| '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
 |