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
							 |